Python 字典键赋值

-3 投票
2 回答
6385 浏览
提问于 2025-04-28 02:50

我从一个元组创建了一个字典,但我找不到方法来交换字典中的键和值,而不去修改原来的元组。现在我有的代码是:

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

撰写回答