2014-10-17 89 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')元组,所以在每个项目价值是我们要添加到我们的新字典的价值之一。