2014-10-17 136 views
-3

我已經從一個元組創建了一個字典,但似乎無法找到答案,我如何在不編輯原始元組的情況下切換我的鍵和值。這是我到目前爲止有:Python字典鍵指定

tuples = [('a', '1'), ('b', '1'), ('c', '2'), ('d', '3')] 

dic = dict(tuples) 

print dic 

這使輸出:

{'a': '1', 'b': ''1', 'c': '2', 'd': '3'} 

但我在尋找:

{'1': 'a' 'b', '2': 'c', '3': 'd'} 

有一個簡單的代碼,可能會產生這種?

+0

http://stackoverflow.com/questions/483666/python-reverse-inverse-a-mapping – 2014-10-17 11:54:34

+0

@RicardoCárdenes:這裏的值不是唯一的。 – 2014-10-17 11:58:22

+1

@MartijnPieters OP沒有說他將如何處理他們。 – simonzack 2014-10-17 11:58:43

回答

1

建立一個循環的字典,收集你的價值觀到列表:

result = {} 

for value, key in tuples: 
    result.setdefault(key, []).append(value) 

dict.setdefault() method將設置,如果鍵不存在返回默認值。在這裏,我用它來設置一個默認的空列表值,如果該鍵不存在,所以.append(value)總是應用於列表對象。

不要試圖將其作爲單個字符串和多個字符串列表值的混合,只會使事情複雜化。

演示:

>>> tuples = [('a', '1'), ('b', '1'), ('c', '2'), ('d', '3')] 
>>> result = {} 
>>> for value, key in tuples: 
...  result.setdefault(key, []).append(value) 
... 
>>> result 
{'1': ['a', 'b'], '3': ['d'], '2': ['c']} 
+0

再加上十億美元到「不要試圖將其作爲單個字符串和多個字符串列表值的混合,你只會使事情複雜化」。 – 2014-10-17 12:17:08

0
from operator import itemgetter 
from itertools import groupby 
first = itemgetter(0) 
second = itemgetter(1) 
d = dict((x, [v for _, v in y]) for x, y in groupby(sorted(tuples, key=second), key=second) 

groupby組元組到元組的新的迭代器,其第一個元素是每個原始,並且其第二元件的唯一的第二項是另一個迭代由相應的第一項組成。一個簡單的例子(適合打印爲清楚起見):

>>> list(groupby(sorted(tuples, key=second), key=second))) 
[('1', <itertools._grouper object at 0x10910b8d0>), 
('2', <itertools._grouper object at 0x10910b790>), 
('3', <itertools._grouper object at 0x10910b750>)] 

由相同的鍵由groupby使用的排序是必需的,以確保所有相似的項目被分組在一起; groupby只有一個通過列表。

的subiterators包括像('1', 'a')元組,所以在每個項目價值是我們要添加到我們的新字典的價值之一。