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'}
有没有简单的代码可以实现这个呢?
2 个回答
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
只会遍历列表一次。
这些子迭代器里的元组像 ('1', 'a')
这样,所以每个项目中的 第二个 值就是我们想要加到新字典里的值。
2
在一个循环中创建一个字典,把你的值收集到列表里:
result = {}
for value, key in tuples:
result.setdefault(key, []).append(value)
dict.setdefault()
方法会在字典里找一个键,如果这个键不存在,它会设置一个默认值并返回。这里我用它来设置一个默认的空列表值,这样无论如何,.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']}