Seite 1 von 1

Frage wegen Namensraum

Verfasst: Dienstag 6. März 2012, 19:03
von HPL
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

Re: Frage wegen Namensraum

Verfasst: Dienstag 6. März 2012, 20:09
von EyDu
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

Re: Frage wegen Namensraum

Verfasst: Dienstag 6. März 2012, 21:19
von BlackJack

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()

Re: Frage wegen Namensraum

Verfasst: Dienstag 6. März 2012, 21:41
von sma
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

Re: Frage wegen Namensraum

Verfasst: Dienstag 6. März 2012, 21:51
von Hyperion
sma hat geschrieben:Ich mach's mal ohne re-Modul :)
Darfst Du das überhaupt? :twisted:

Re: Frage wegen Namensraum

Verfasst: Dienstag 6. März 2012, 22:10
von sma
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

Re: Frage wegen Namensraum

Verfasst: Dienstag 6. März 2012, 22:52
von BlackJack
@HPL: Mir fällt gerade auf, dass ich den Bezug zwischen dem Betreff dieses Themas und der Frage irgendwie nicht hergestellt bekomme!?