Seite 1 von 1
Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 17:48
von api
Hallo zusammen,
wahrscheinlich ganz simpel, aber ich komme grad nicht drauf...
Gegeben sei eine Liste:
[['Markets/logs'], ['Sys/logs'], ['Sys2/logs']]
Diese Liste möchte ich nun in das folgende Format umwandeln:
['Markets/logs', 'Sys/logs', 'Sys2/logs']
Kann mir da mal einer kurz auf die Sprünge helfen?
CU,
API
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 17:50
von EyDu
Vielleicht einfach eine for-Schleife?!
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 17:50
von Hyperion
So?
Code: Alles auswählen
In [3]: nested = [['Markets/logs'], ['Sys/logs'], ['Sys2/logs']]
In [4]: import itertools
In [5]: list(itertools.chain.from_iterable(nested))
Out[5]: ['Markets/logs', 'Sys/logs', 'Sys2/logs']
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 17:56
von api
@eyDu: Ja. Aber ich wollte eine etwas elegantere Lösung... Das geht bestimmt.
@Hyperion: Bestimmt recht gut. Aber! Sorry, ich vergaß zu sagen, dass ich nur Python 2.4.6 zur Verfügung habe. Itertools ist zwar vorhanden, aber 'from_iterable' nicht.
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 18:02
von api
Sagen wir es mal so. Ich könnte es mit der folgenden For-Schleife lösen:
a_list = [['Markets/logs'], ['Sys/logs'], ['Sys2/logs']]
for i in range(len(a_list)):
... b_list.append(a_list[0])
print b_list
Aber - geht das nicht auch eleganter? Evtl einzeilig?
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 18:09
von Hyperion
api hat geschrieben:
@Hyperion: Bestimmt recht gut. Aber! Sorry, ich vergaß zu sagen, dass ich nur Python 2.4.6 zur Verfügung habe. Itertools ist zwar vorhanden, aber 'from_iterable' nicht.
Du könntest gucken, ob es mit
Brownie klappt - allerdings ist das wohl nur auf 2.5 getestet.
Alternativ besser so:
Code: Alles auswählen
In [22]: res = []
In [23]: for item in nested:
....: res.extend(item)
....:
In [24]: res
Out[24]: ['Markets/logs', 'Sys/logs', 'Sys2/logs']
`for i in range(len(iterable))` vergisst Du am besten schnell! Man kann über Iterables auch direkt iterieren. Indizes erzeugt man sich dann mittels `enumerate` dazu. Aber das hatten wir ja unlängst in einer Diskussion mit unserem User "problembär"...
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 18:10
von EyDu
Na mit einer einfach Schleife eben:
Du solltest übrigens besser direkt über Elemente der Listen iterieren, der Schritt über `range` ist nicht nur überflüssig sondern auch unschön. In den seltenen Fällen, in denen ein Index benötigt wird, solltest du `enumerate` verwenden.
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 18:21
von /me
api hat geschrieben:Sagen wir es mal so. Ich könnte es mit der folgenden For-Schleife lösen:
a_list = [['Markets/logs'], ['Sys/logs'], ['Sys2/logs']]
for i in range(len(a_list)):
... b_list.append(a_list[0])
print b_list
Igitt. Arbeite immer mit den Elementen selber, statt mit einem konstruierten Index.
Von da ist es dann gedanklich auch nur noch nur ein kurzer Schritt zu der von EyDu gezeigten List Comprehension.
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 18:26
von EyDu
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 18:30
von api
Danke an euch alle!!!
Wie ich schon sagte, meine Lösung war nicht die beste...
Wieder was dazu gelernt!

Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 19:19
von /me
EyDu hat geschrieben:Fast vergessen:
Funktionaltaliban!
Re: Einfache Liste aus Liste
Verfasst: Montag 28. November 2011, 21:23
von cofi
/me hat geschrieben:EyDu hat geschrieben:Fast vergessen:
Funktionaltaliban!
Am Ende schmeisst er noch mit PEP8-Bomben, ne? Da brauchen wir eindeutig eine Vorratsdatenspeicherung!
Re: Einfache Liste aus Liste
Verfasst: Dienstag 29. November 2011, 05:01
von Leonidas
Ja aber ne, das kann man doch sicher mit ner ``while``-Schleife, ganz vielen Countern und ``range(len(...))`` lösen. Wie in C halt auch!

SCNR!
Re: Einfache Liste aus Liste
Verfasst: Dienstag 29. November 2011, 08:30
von /me
Leonidas hat geschrieben:Ja aber ne, das kann man doch sicher mit ner ``while``-Schleife, ganz vielen Countern und ``range(len(...))`` lösen. Wie in C halt auch!

SCNR!
Dabei ist die Lösung doch so einfach:
Code: Alles auswählen
data = [['Markets/logs'], ['Sys/logs'], ['Sys2/logs']]
data = eval('list({0})'.format(repr(data).replace("['", "'").replace("']", "'")))
for element in data:
print(element)
Sicherheitshalber:
Kids, don't do this at home!