Einfache Liste aus Liste

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

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

Vielleicht einfach eine for-Schleife?!
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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']
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

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

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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"...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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

Fast vergessen:

Code: Alles auswählen

map(operator.itemgetter(0), elements)
Das Leben ist wie ein Tennisball.
api
User
Beiträge: 181
Registriert: Donnerstag 7. August 2008, 21:23

Danke an euch alle!!!

Wie ich schon sagte, meine Lösung war nicht die beste... :(

Wieder was dazu gelernt! :D
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

EyDu hat geschrieben:Fast vergessen:

Code: Alles auswählen

map(operator.itemgetter(0), elements)
Funktionaltaliban!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

/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!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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