2017-04-20 202 views
3

我如何轉換就像下面的例子本字典的元組:蟒蛇:字典的元組字典

({(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}) 

像字典一個相當簡單的形式:

{(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

那你試試,什麼不工作? – Vallentin

+1

看起來你應該能夠用元組的每個元素「更新」一個字典。 – mgilson

回答

3

只是重複的元組和使用字典理解重建詞典「平」:

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) 

結果:

{(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

有趣的是,變量名稱是相同的:) – vav

+1

心靈感應或「儘可能快地鍵入並選擇短變量名稱」?我會讓你決定:) –

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

如果爲了在期望dict元件的事項並且需要作爲問題提及進行排序,使用collections.OrderedDict爲:

# `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)]) 

但返回排序dict保持該訂單相當於問題中所需的訂單:

{(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} 

如果所需dict元素的順序並不重要,你可以使用簡單的字典理解實現它:

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

其中required_dict值將是:

{ 
    (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 
} 

注意:所需字典中的項目順序不同,因爲Python中的字典本質上是無序的。

2

不能使用的字典合併理解(還),但你可以通過chain map去:

>>> 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} 

注:collections.ChainMap在Python 3.3是新的。

它實際上是collections.Mapping的一個子類,所以根據用例,你可能甚至不需要轉換回普通的字典。

0

可以與所有類型的字典更新初始字典形成的元組:

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

再一個,獨家的Python 3.5和更高版本:

>>> 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}