Hallo zusammen,
ich möchte gerne aus dieser gegebenen Liste..
[['libs', 'D', ['1', '2'], 'd71', 'rade'],
['libs', 'D', ['1', '2'], ['d79', 'd80', 'd134', 'd135'], 'rade']]
diese Liste erzeugen...
[['libs', 'D', '1', 'd71', 'rade'],
['libs', 'D', '2', 'd71', 'rade'],
['libs', 'D', '1', 'd79', 'rade'],
['libs', 'D', '2', 'd79', 'rade'],
['libs', 'D', '1', 'd80', 'rade'],
['libs', 'D', '2', 'd80', 'rade'],
['libs', 'D', '1', 'd134', 'rade'],
['libs', 'D', '2', 'd134', 'rade'],
['libs', 'D', '1', 'd135', 'rade'],
['libs', 'D', '2', 'd135', 'rade']]
Wie stelle ich das am geschicktesten an?
CU,
API
Liste aus einer Liste erzeugen
-
- User
- Beiträge: 31
- Registriert: Sonntag 3. Oktober 2010, 12:21
du brauchst eine funktion, die eine liste nimmt und darüber iteriert. wenn es in der liste eine liste findet, dann ruft es sich selbst auf mit der liste, aber an der stelle der verschatelten liste, wird ein element der liste angegeben, das wiederholen für alle elemente der verschatelten liste
pseudo-code (schnell mal hingeschrieben):
pseudo-code (schnell mal hingeschrieben):
Code: Alles auswählen
liste_aus_liste(l: list):
for x in l:
if x liste:
for y in x:
l_neu = l[bis x] + y + l[ab x]
result + liste_aus_liste(l_neu)
Oder einfach so:
Code: Alles auswählen
>>> import itertools
>>> list(itertools.product(*[x if isinstance(x, list) else [x] for x in ['libs', 'D', ['1', '2'], ['d79', 'd80', 'd134', 'd135'], 'rade']]))
[('libs', 'D', '1', 'd79', 'rade'), ('libs', 'D', '1', 'd80', 'rade'), ('libs', 'D', '1', 'd134', 'rade'), ('libs', 'D', '1', 'd135', 'rade'), ('libs', 'D', '2', 'd79', 'rade'), ('libs', 'D', '2', 'd80', 'rade'), ('libs', 'D', '2', 'd134', 'rade'), ('libs', 'D', '2', 'd135', 'rade')]
Das Leben ist wie ein Tennisball.
@EyDu: Wow!! Das sieht echt gut aus...
Das ist bestimmt aus Python3 ??
Leider hab ich den Rest des Programms noch unter 2.4.6 entwickelt - muss mal sehen, ob ich das umstelle...
Oder wüsstest du auch noch ne Lösung für 2.4.6?


Das ist bestimmt aus Python3 ??
Leider hab ich den Rest des Programms noch unter 2.4.6 entwickelt - muss mal sehen, ob ich das umstelle...
Oder wüsstest du auch noch ne Lösung für 2.4.6?
@EyDu: Ich lese gerade, dass es diese Funktionalität schon in 2.6 geben soll.
Dann muss ich leider sagen, dass es dort einen Syntax-Error gibt...
Dann muss ich leider sagen, dass es dort einen Syntax-Error gibt...

Code: Alles auswählen
File "test.py", line 5
list(itertools.product(*[x if isinstance(x, list) else [x] for x in ['libs', 'D', ['1', '2'], ['d79', 'd80', 'd134', 'd135'], 'rade']]))
^
SyntaxError: invalid syntax
@derdon: Ich hab ja Python 3.1 - aber das Programm, was ich gerade schreibe, hab ich unter 2.4.6 angefangen... - ansonsten haste natürlich recht...
@EyDu: Was meinst du mit "einfach" basteln? Soll ich deinen Vorschlag als Funktion unter Python 3.1 auslagern? Oder wie meinst du das?

@EyDu: Was meinst du mit "einfach" basteln? Soll ich deinen Vorschlag als Funktion unter Python 3.1 auslagern? Oder wie meinst du das?
Es soll manchmal ungemein hilfreich sein, wenn man erstmal versteht was eine gegebene Lösung macht.
Code: Alles auswählen
>>> def ifthen(condition, iftrue, iffalse):
... if condition:
... return iftrue
... else:
... return iffalse
Das Leben ist wie ein Tennisball.
@EyDu: Ich glaube zwar, dass ich dein Script (mit itertools) verstanden habe, bin mir nun aber nicht mehr sicher, da ich mit deinem jetzigen Vorschlag gar nicht klarkomme.
Mit itertools bzw. der Funktion "product" kann ich ja eben diese Produkte bilden. Wie soll mir da jetzt eine Funktion "ifthen" helfen
Also, ich stehe da jetzt komplett auf dem Schlauch...
Auf eine Liste hin zu prüfen, geht ja nachwievor mit "isinstance(x, list)" - aber der Rest gibt mir zZ nur Rätsel auf.
Mit itertools bzw. der Funktion "product" kann ich ja eben diese Produkte bilden. Wie soll mir da jetzt eine Funktion "ifthen" helfen

Also, ich stehe da jetzt komplett auf dem Schlauch...

Auf eine Liste hin zu prüfen, geht ja nachwievor mit "isinstance(x, list)" - aber der Rest gibt mir zZ nur Rätsel auf.
Der Syntaxfehler deutet darauf hin, dass er das if-then-Konstrukt an dieser Stelle nicht akzeptiert. Wenn du das durch eine Funktion ersetzt, dann bist du das Problem los.
Das Leben ist wie ein Tennisball.
Das bezweifle ich. Es ist nicht nur der bedingte Ausdruck, sondern auch die LC - die gibt es erst ab Python 2.5.EyDu hat geschrieben:Wenn du das durch eine Funktion ersetzt, dann bist du das Problem los.
Aber wer mit der Begründung bei Python 2.4 bleibt, er habe ein Projekt damit angefangen, der hat es auch nicht besser verdient.

@EyDu, numerix: Das ist das, was ich ja meine - meine Version 2.4 gibt nunmal ein "itertools.product" nicht her...
Aber klar, es krampfhaft mit 2.4 fertigstellen zu wollen, ist natürlich nicht gerade verständlich. Ich werde es wohl auch nach 3.1 umstellen - wäre aber mein erstes Prg in 3.1 (irgendwann muss man ja mal anfangen!)
Andererseits hätte es mich schon interessiert, ob man das unter 2.4 ähnlich elegant hinbekommen hätte
Aber ich danke euch für die Hilfe.

Aber klar, es krampfhaft mit 2.4 fertigstellen zu wollen, ist natürlich nicht gerade verständlich. Ich werde es wohl auch nach 3.1 umstellen - wäre aber mein erstes Prg in 3.1 (irgendwann muss man ja mal anfangen!)

Andererseits hätte es mich schon interessiert, ob man das unter 2.4 ähnlich elegant hinbekommen hätte


Aber ich danke euch für die Hilfe.

Dann werfe ich der jetzt einfach mal vor, dass du nicht einmal einen Blick in die Dokumentation geworfen hast. Dort steht sogar der Code der Implementierung
. Außerdem sollte man die product-Funktion auch ohne groß nachzudenken selber schreiben können.
Die beste Lösung ist aber sicher auf eine aktuelle Version zu wechseln. Mit 2.4 wirst du früher oder später untergehen.

Die beste Lösung ist aber sicher auf eine aktuelle Version zu wechseln. Mit 2.4 wirst du früher oder später untergehen.
Das Leben ist wie ein Tennisball.
Wobei ich sicherheitshalber noch einmal betonen möchte, das aktuell auch eine 2.7 ist und nicht nur eine 3.1. Es gibt momentan zwei aktuelle Entwicklungszweige. Auch wenn die 2er auslaufen wird, denke ich die wird noch eine ganze Weile aktuell zur Verfügung stehen.
Von einer 2.7 ist dann auch der Sprung zu einer 3er sicher einfacher zu machen, weil man den Quelltext auf der 2.7er laufend schon darauf vorbereiten kann und so einen fliessenderen Übergang hin bekommt.
Meine Linux-Distribution hat 2.6 als Standardpython installiert. Das wird bei mir wohl die nächsten 5 Jahre die Basis sein. Von den Quelltexten abgesehen, die wegen Jython noch auf 2.5 laufen müssen. Oder vielleicht demnächst PyPy -- das ist ja auch nicht uninteressant.
Von einer 2.7 ist dann auch der Sprung zu einer 3er sicher einfacher zu machen, weil man den Quelltext auf der 2.7er laufend schon darauf vorbereiten kann und so einen fliessenderen Übergang hin bekommt.
Meine Linux-Distribution hat 2.6 als Standardpython installiert. Das wird bei mir wohl die nächsten 5 Jahre die Basis sein. Von den Quelltexten abgesehen, die wegen Jython noch auf 2.5 laufen müssen. Oder vielleicht demnächst PyPy -- das ist ja auch nicht uninteressant.