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

Dictionary zur einfachen Sequence umbauen

Beitragvon Zap » Mittwoch 11. Juli 2007, 11:49

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

Beitragvon Y0Gi » Mittwoch 11. Juli 2007, 12:04

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

Beitragvon birkenfeld » Mittwoch 11. Juli 2007, 12:23

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

Beitragvon Y0Gi » Mittwoch 11. Juli 2007, 13:52

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

Beitragvon birkenfeld » Mittwoch 11. Juli 2007, 14:14

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

Beitragvon Zap » Mittwoch 11. Juli 2007, 14:49

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

Beitragvon BlackJack » Mittwoch 11. Juli 2007, 16:18

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

Beitragvon birkenfeld » Mittwoch 11. Juli 2007, 16:42

*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

Beitragvon lord.hong » Mittwoch 11. Juli 2007, 21:11

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?
BlackJack

Beitragvon BlackJack » Mittwoch 11. Juli 2007, 21:26

Ja.

Wer ist online?

Mitglieder in diesem Forum: Bananasplit