2017-04-20 3 views
3

Wie kann ich Tupel von Wörterbüchern wie zB konvertieren vorhanden unten:Python: Tupel von Wörterbuch Wörterbuch

({(1, 2): 3}, 
{(1, 3): 5}, 
{(1, 4): 5}, 
{(2, 4): 5}, 
{(1, 5): 10}, 
{(2, 6): 9}, 
{(1, 6): 9}, 
{(2, 1): 2}, 
{(2, 2): 3}, 
{(2, 3): 5}, 
{(2, 5): 10}, 
{(1, 1): 2}) 

auf eine eher einfachere Form wie Wörterbuch:

{(1, 1): 2, 
(1, 2): 3, 
(1, 3): 5, 
(1, 4): 5, 
(1, 5): 10, 
(1, 6): 9, 
(2, 1): 12, 
(2, 2): 7, 
(2, 3): 7, 
(2, 4): 3, 
(2, 5): 4, 
(2, 6): 2} 
+1

Was haben Sie versucht, und was nicht Arbeit? – Vallentin

+1

Es scheint, als ob Sie in der Lage sein sollten, ein Wörterbuch mit jedem Element des Tupels zu "aktualisieren". – mgilson

Antwort

3

nur auf den Tupeln iterieren und wieder aufzubauen, das Wörterbuch "flat" mit einem Wörterbuch Verständnis:

a = ({(1, 2): 3}, 
{(1, 3): 5}, 
{(1, 4): 5}, 
{(2, 4): 5}, 
{(1, 5): 10}, 
{(2, 6): 9}, 
{(1, 6): 9}, 
{(2, 1): 2}, 
{(2, 2): 3}, 
{(2, 3): 5}, 
{(2, 5): 10}, 
{(1, 1): 2}) 

b = {k:v for t in a for k,v in t.items()} 

print(b) 

Ergebnis:

{(1, 2): 3, (2, 6): 9, (2, 1): 2, (1, 1): 2, (1, 5): 10, (1, 3): 5, (1, 6): 9, (1, 4): 5, (2, 2): 3, (2, 3): 5, (2, 5): 10, (2, 4): 5} 
+0

es ist interessant, dass Variablenname ist der gleiche :) – vav

+1

Telepathie oder "Typ so schnell wie Sie können und kurze Variablennamen wählen"? Ich werde dich entscheiden lassen :) –

1
>>> a=({(1, 2): 3}, 
{(1, 3): 5}, 
{(1, 4): 5}, 
{(2, 4): 5}, 
{(1, 5): 10}, 
{(2, 6): 9}, 
{(1, 6): 9}, 
{(2, 1): 2}, 
{(2, 2): 3}, 
{(2, 3): 5}, 
{(2, 5): 10}, 
{(1, 1): 2}) 
>>> {key: x[key] for x in a for key in x} 
{(1, 2): 3, (2, 6): 9, (1, 4): 5, (1, 1): 2, (1, 5): 10, (1, 3): 5, (1, 6): 9, (2, 1): 2, (2, 2): 3, (2, 3): 5, (2, 5): 10, (2, 4): 5} 
>>> 
2

Wenn Reihenfolge der Elemente in der gewünschten dict zählt, und benötigt wird, um sortiert werden, wie in der Frage erwähnt, verwenden collections.OrderedDict als:

# `original_list` is the variable holding the 
# `list` of `dict` as mentioned in the question 

required_dict = OrderedDict(
    sorted((k, v) for sub_list in original_list for k, v in sub_list.items())) 

# `OrderedDict` is represented as: 
# OrderedDict([((1, 1), 2), ((1, 2), 3), ((1, 3), 5), ((1, 4), 5), ((1, 5), 10), ((1, 6), 9), ((2, 1), 2), ((2, 2), 3), ((2, 3), 5), ((2, 4), 5), ((2, 5), 10), ((2, 6), 9)]) 

kehrt aber sortiert dict beibehalten die Reihenfolge, die der in der Frage gewünschten entspricht:

{(1, 1): 2, 
(1, 2): 3, 
(1, 3): 5, 
(1, 4): 5, 
(1, 5): 10, 
(1, 6): 9, 
(2, 1): 12, 
(2, 2): 7, 
(2, 3): 7, 
(2, 4): 3, 
(2, 5): 4, 
(2, 6): 2} 

Aber wenn Reihenfolge der Elemente in der gewünschten dict nicht egal, können Sie einfach dict Verständnis verwenden es zu erreichen, wie:

required_dict = {k: v for sub_list in original_list for k, v in sub_list.items()} 

, wo der Wert von required_dict wird:

{ 
    (1, 2): 3, 
    (2, 6): 9, 
    (1, 4): 5, 
    (1, 1): 2, 
    (1, 5): 10, 
    (1, 3): 5, 
    (1, 6): 9, 
    (2, 1): 2, 
    (2, 2): 3, 
    (2, 3): 5, 
    (2, 5): 10, 
    (2, 4): 5 
} 

Hinweis: Reihenfolge der Elemente in der gewünschten dict sind unterschiedlich, weil Wörterbücher in Python von der Natur ungeordnet sind.

2

Sie können keine dict merge Verständnis (noch) nicht verwenden, aber man kann über eine chain map gehen:

>>> from collections import ChainMap 
>>> dict(ChainMap(*dicts)) 
{(1, 1): 2, 
(1, 2): 3, 
(1, 3): 5, 
(1, 4): 5, 
(1, 5): 10, 
(1, 6): 9, 
(2, 1): 2, 
(2, 2): 3, 
(2, 3): 5, 
(2, 4): 5, 
(2, 5): 10, 
(2, 6): 9} 

Hinweis:collections.ChainMap ist neu in Python 3.3.

Es ist eigentlich eine Unterklasse von collections.Mapping, so dass Sie je nach Anwendungsfall nicht einmal in ein einfaches dict konvertieren müssen.

0

Sie können mit allen dicts einen anfänglichen dict aktualisieren bilden das Tupel:

values = ({(1, 2): 3}, 
{(1, 3): 5}, 
{(1, 4): 5}, 
{(2, 4): 5}, 
{(1, 5): 10}, 
{(2, 6): 9}, 
{(1, 6): 9}, 
{(2, 1): 2}, 
{(2, 2): 3}, 
{(2, 3): 5}, 
{(2, 5): 10}, 
{(1, 1): 2}) 

d = dict() 
reduce(lambda _, v: d.update(v), values) 
-1

ein anderer, exklusiv für Python 3.5 und neuer:

>>> functools.reduce(lambda d1, d2: {**d1, **d2}, values) 
{(1, 2): 3, (2, 6): 9, (2, 1): 2, (1, 1): 2, (1, 5): 10, (1, 3): 5, (1, 6): 9, (1, 4): 5, (2, 2): 3, (2, 3): 5, (2, 5): 10, (2, 4): 5}