Dictionary zur einfachen Sequence umbauen

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
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Hallo zusammen,

irgendwie bin ich ein richtiger Fan von list-comprehensions geworden
(natürlich nur wenns lesbar bleibt).

Aber für diese Kleinigkeit die ich hier vorhabe finde ich irgendwie keine
elegantere Lösung.
Ihr vielleicht?

Code: Alles auswählen

>>> d = {1:"eins",2:"zwei",3:"drei"}
>>> l = list()
>>> for k,v in d.items():
...  l.append(k)
...  l.append(v)
...
>>> l
[1, 'eins', 2, 'zwei', 3, 'drei']
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Man könnte eine "blinde" for-Schleife benutzen:

Code: Alles auswählen

>>> [l.extend((k, v)) for k, v in d.items()]
[None, None, None]  # ignorier mich
>>> l
[1, 'eins', 2, 'zwei', 3, 'drei']
Oder aber so:

Code: Alles auswählen

>>> from itertools import chain
>>> list(chain(*(x for x in d.iteritems())))
[1, 'eins', 2, 'zwei', 3, 'drei']
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Oder aber so:

Code: Alles auswählen

>>> from itertools import chain
>>> list(chain(*(x for x in d.iteritems())))
[1, 'eins', 2, 'zwei', 3, 'drei']
Das ist aber bei großen Dicts nicht sehr geschickt, da `*` das Argument "ausiteriert".
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Mach's besser :)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Wie wärs mit

Code: Alles auswählen

reduce(lambda x,y: x+y, d.iteritems())
Wenn man will, kann man natürlich auch

Code: Alles auswählen

from operator import add
reduce(add, d.iteritems())
nehmen.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Vielen dank für die Anworten.
Das extend() ist bei mir völlig in vergessenheit geraten.

Bei dem reduce ist ja leider das Problem das es verschwinden soll.
Hatte den Gedanken auch erst gehabt und dann wieder verworfen.

Ich hab gerade nochmal nach dem Grund gesucht warum es raus fliegt aber keinen gefunden.
Wisst ihr da was genaueres? Soll es built-in alternativen geben?
BlackJack

IMHO wird da der Dummheit der Programmierermasse nachgegeben, denen funktionale Programmierung zu hoch ist. Python entwickelt sich in dem Punkt in Richtung Java. ;-) (War nur Spass)

Soweit ich weiss verschwinden diese Funktionen nicht komplett, sondern sind einfach nur keine "built-ins" mehr. Man muss sie dann aus einem Modul importieren.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

*seufz*

map() und filter() bleiben, reduce() wandert nach functools.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
lord.hong
User
Beiträge: 26
Registriert: Samstag 19. August 2006, 12:32

BlackJack hat geschrieben:IMHO wird da der Dummheit der Programmierermasse nachgegeben, denen funktionale Programmierung zu hoch ist. Python entwickelt sich in dem Punkt in Richtung Java. ;-) (War nur Spass)
Wurde in den obigen Beispielen funktionale Programmierung benutzt?
Antworten