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:

Code: Alles auswählen

[elem[0] for elem in elements]
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.

Code: Alles auswählen

for element in a_list:
    b_list.append(element[0])
Von da ist es dann gedanklich auch nur noch nur ein kurzer Schritt zu der von EyDu gezeigten List Comprehension.

Code: Alles auswählen

b_list = [element[0] for element in a_list]

Re: Einfache Liste aus Liste

Verfasst: Montag 28. November 2011, 18:26
von EyDu
Fast vergessen:

Code: Alles auswählen

map(operator.itemgetter(0), elements)

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! :D

Re: Einfache Liste aus Liste

Verfasst: Montag 28. November 2011, 19:19
von /me
EyDu hat geschrieben:Fast vergessen:

Code: Alles auswählen

map(operator.itemgetter(0), elements)
Funktionaltaliban!

Re: Einfache Liste aus Liste

Verfasst: Montag 28. November 2011, 21:23
von cofi
/me hat geschrieben:
EyDu hat geschrieben:Fast vergessen:

Code: Alles auswählen

map(operator.itemgetter(0), elements)
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! :twisted: 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! :twisted: 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!