Liste aus einer Liste erzeugen

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.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

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
0x1cedd1ce
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):

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)
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Ui !!

Das klingt ein wenig kompliziert. :shock:

Aber ich werde man drüber nachgrübeln, wie ich das in laufenden Code umsetze...
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@EyDu: Wow!! Das sieht echt gut aus... :D :D

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?
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@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... :(

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
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ist das 2.4 oder 2.6?
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@EyDu: Ok - da bin ich schon wieder...

Unter Python 3.1 läuft es... ist wohl doch ein Versions-Problem. :(

Deshalb dann doch noch mal die Frage, ob es auch ne Lösung unter Python 2.4.6 gibt?
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@derdon: Sorry, ich habe hier Version 2.4.6 - habe mich durch die 6 hinten etwas irritieren lassen... :(
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Mach mal ein Update. Python 2.4 ist mittlerweile 6 Jahre alt, es hat sich einiges geändert.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du kannst aus dem if-then auch einfach eine Funktion basteln.
Das Leben ist wie ein Tennisball.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@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
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

EyDu hat geschrieben:Wenn du das durch eine Funktion ersetzt, dann bist du das Problem los.
Das bezweifle ich. Es ist nicht nur der bedingte Ausdruck, sondern auch die LC - die gibt es erst ab Python 2.5.
Aber wer mit der Begründung bei Python 2.4 bleibt, er habe ein Projekt damit angefangen, der hat es auch nicht besser verdient. :D
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

@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!) :wink:

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. :D
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Warum muss es denn unbedingt "3.1" sein? Nimm doch z.B. Python 2.6 und dein "2.4"-Code wird aller Wahrscheinlichkeit nach unverändert laufen und das Snippet von EyDu kannst du dann auch einsetzen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
BlackJack

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.
Antworten