2017-01-04 3 views
4

Angenommen, ich habe folgendes dict Objekt:verketten dict Werte, die Listen sind

test = {} 
test['tree'] = ['maple', 'evergreen'] 
test['flower'] = ['sunflower'] 
test['pets'] = ['dog', 'cat'] 

Nun, wenn ich test['tree'] + test['flower'] + test['pets'] laufen lasse, erhalte ich das Ergebnis:

['maple', 'evergreen', 'sunflower', 'dog', 'cat'] 

das ist, was ich will.

Angenommen, ich bin mir nicht sicher, welche Tasten im dict-Objekt sind, aber ich weiß, dass alle Werte Listen sind. Gibt es einen Weg wie sum(test.values()) oder etwas, das ich ausführen kann, um das gleiche Ergebnis zu erzielen?

Antwort

6

Sie fast die Antwort in der Frage gab: sum(test.values()) nur schlägt fehl, weil es standardmäßig annimmt, dass Sie die Elemente zu einem Startwert vonhinzufügen möchten 210 - und natürlich können Sie keine list zu einem int hinzufügen. Wenn Sie jedoch explizit über den Startwert sind, dann wird es funktionieren:

sum(test.values(), []) 
+0

Danke für die Erklärung! Gut zu wissen, dass ich auf dem richtigen Weg war. Dieser eine Liner ist der kürzeste und am besten lesbare. In bestimmten Einstellungen, die eine bessere Lesbarkeit erfordern, kann ich auch die Antwort von Psidom verwenden. – nwly

5

Verwenden chain von itertools:

>>> from itertools import chain 
>>> list(chain.from_iterable(test.values())) 
# ['sunflower', 'maple', 'evergreen', 'dog', 'cat'] 
+4

Nicht sicher, warum der Downvote, aber das ist meine Lösung auch. Eine Alternative ist 'list (chain (* test.values ​​()))' – DaveQ

4

One-Liner (keine spezifische Bestellung übernimmt erforderlich):

>>> [value for values in test.values() for value in values] 
['sunflower', 'maple', 'evergreen', 'dog', 'cat'] 
2

Sie functools.reduce und operator.concat verwenden könnte (ich nehme an, Sie Python 3 verwenden) wie folgt aus:

>>> from functools import reduce 
>>> from operator import concat 
>>> reduce(concat, test.values()) 
['maple', 'evergreen', 'sunflower', 'dog', 'cat']