Frage wegen Namensraum

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
HPL
User
Beiträge: 10
Registriert: Mittwoch 1. Dezember 2010, 14:29

Dienstag 6. März 2012, 19:03

Ich habe einen String str="{1.2, 3, 4}{5, 3}{6.6, 9}".

Die Zahlen in den geschweiften Klammern stellen einen Vektor dar. Ich will nun zwei Strings erzeugen, output1 sowie output2, wobei ich den Zufall entscheiden lassen will, aus welchen Vektoren die beiden strings, output1 und output2, jeweils bestehen sollen.

Code: Alles auswählen

import random

def function():
         str="{1.2, 3, 4}{5, 3}{6.6, 9}"
 
         output1 ="" 
         output2 =""

         zahl=0

         for el in str:
                  if el == "}":
                           sr = random.SystemRandom()
                           a = sr.randint(1, 2)
#Ich generiere eine Zufallszahl zwischen 1 und 2.                           

                           if a == 1:

                                    output1 += str[zahl:str.find(el)]
#output1 wird hier um den slice von zahl=0 bis zum ersten Vorkommen von el=="}" erweitert.

                                    zahl=str.find(el)
#zahl=0 bekommt das erste Vorkommen von el="}" als Wert (??Geht das?).
                                    str.replace(el, "", 1)
           
#Das erste Vorkommen von "}" wird eliminiert. Dies soll nun für jede schließende Vektorklammer 
#geschehen, wenn el wieder == "}" ist, bekommt je nach dem entweder output1 oder output2 einen
#neuen slice von str dazu, und zwar zwischen zahl und }.


                           if a == 2:

                                    output1 += str[zahl:str.find(el)]

                                    zahl=str.find(el)
                                    str.replace(el, "", 1)

Wenn ich diesen Code durchlaufen lasse, wird {1.2, 3, 4 ausgegeben.

Woran liegt das? Wenn die Frage zu dumm ist, hoffe ich, dass ich nicht euren Groll hervorrufe :K
Zuletzt geändert von Anonymous am Dienstag 6. März 2012, 21:11, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
EyDu
User
Beiträge: 4872
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Dienstag 6. März 2012, 20:09

Hallo.

Das sieht irgendwie etwas seltsam aus, was du dort vor hast. Interessant wäre zunächst einmal, warum du die Daten als String erhältst und nicht bereits als irgendwelche Strukturen in Python. Vielleicht kann man hier etwas vereinfachen, dass dein Schritt gar nicht erst notwendig wird. Ist das Format vorgegeben? Verwendest du vielleicht ein externes Tool?

Wenn das Format so vorgegeben ist, dann würde ich auch nicht versuchen das Parsen mit einer for-Schleife zu machen, sondern mittels einfacher String-Operationen wie ``str.split`` oder regulären Ausdrücken. Gibt es eigentich einen Grund, warum du ``SystemRandom`` und nicht einfach direkt die Funktionen aus dem random-Modul?

Sebastian
Das Leben ist wie ein Tennisball.
BlackJack

Dienstag 6. März 2012, 21:19

Code: Alles auswählen

import random
import re


def main():
    string = '{1.2, 3, 4}{5, 3}{6.6, 9}'
    vector_a, vector_b = random.sample(re.findall(r'\{.*?\}', string), 2)
    print vector_a, vector_b


if __name__ == '__main__':
    main()
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 6. März 2012, 21:41

Ich mach's mal ohne re-Modul :)

Code: Alles auswählen

import random

s = "{1.2, 3, 4}{5, 3}{6.6, 9}"

print random.sample(s.replace("}{", "}~{").split("~"), 2)
Stefan
Benutzeravatar
Hyperion
Moderator
Beiträge: 7477
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dienstag 6. März 2012, 21:51

sma hat geschrieben:Ich mach's mal ohne re-Modul :)
Darfst Du das überhaupt? :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Dienstag 6. März 2012, 22:10

Hyperion hat geschrieben:Darfst Du das überhaupt? :twisted:
BlackJack war leider schneller und da musste ich mir was anderes überlegen. :?

Um ganz klever zu sein, wollte ich eigentlich "(?<=})(?={)" als Pattern für re.split() vorschlagen, musste dann aber lernen, dass ein leerer Match nur mit look-behind und look-ahead explizit nicht greift.

Stefan
BlackJack

Dienstag 6. März 2012, 22:52

@HPL: Mir fällt gerade auf, dass ich den Bezug zwischen dem Betreff dieses Themas und der Frage irgendwie nicht hergestellt bekomme!?
Antworten