Seite 1 von 1

Dictionary zur einfachen Sequence umbauen

Verfasst: Mittwoch 11. Juli 2007, 11:49
von Zap
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']

Verfasst: Mittwoch 11. Juli 2007, 12:04
von Y0Gi
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']

Verfasst: Mittwoch 11. Juli 2007, 12:23
von birkenfeld
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".

Verfasst: Mittwoch 11. Juli 2007, 13:52
von Y0Gi
Mach's besser :)

Verfasst: Mittwoch 11. Juli 2007, 14:14
von birkenfeld
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.

Verfasst: Mittwoch 11. Juli 2007, 14:49
von Zap
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?

Verfasst: Mittwoch 11. Juli 2007, 16:18
von 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.

Verfasst: Mittwoch 11. Juli 2007, 16:42
von birkenfeld
*seufz*

map() und filter() bleiben, reduce() wandert nach functools.

Verfasst: Mittwoch 11. Juli 2007, 21:11
von lord.hong
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?

Verfasst: Mittwoch 11. Juli 2007, 21:26
von BlackJack
Ja.