在Python中连接具有相同键的字典列表中的唯一值
我正在处理一个字典列表,想把它们合并成一个字典,条件如下:
- 列表中的字典都有相同的键,新字典也会有这些键。
- 如果所有字典中某个键的值都相同,那么在新字典中这个值只出现一次。
- 如果所有字典中某个键的值各不相同,那么在新字典中这个键的值会是一个用逗号分隔的字符串,包含所有这些值。
简单来说,我想为每个键在多个字典中创建一个集合,然后把这个集合的值用逗号分隔的方式放到新字典里。为了帮助理解,假设有:
data = [ {"key1": "value1", "key2": "value2", "key3": "value3"},
{"key1": "value4", "key2": "value5", "key3": "value3"},
{"key1": "value1", "key2": "value8", "key3": "value3"} ]
我想把这些数据做成一个新的字典,结果应该是这样的:
myDict = {"key1": "value1, value4", "key2": "value2, value5, value8", "key3": "value3"}
有没有什么好主意可以实现这个目标呢?
3 个回答
1
In [3]: from itertools import chain
In [12]: dict([ (key, ",".join(set([elem[key] for elem in data]))) for key in set(list(chain(*[d.keys() for d in data])))])
Out[12]: {'key1': 'value4,value1', 'key2': 'value5,value2,value8', 'key3': 'value3'}
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
5
collections.defaultdict
是个好帮手。
from collections import defaultdict
temp_dict = defaultdict(set)
for item in data:
for key, value in item.items():
temp_dict[key].add(value)
这样你就得到了一个字典,格式是 {"key1": ["value1", "value4"]}
- 如果你想要值是用逗号分隔的字符串,可以把它们连接起来:
my_dict = {}
for key, value in temp_dict.items():
my_dict[key] = ", ".join(value)
3
我这里假设了两件事——第一,你对值的顺序不太在意;第二,你不想在每个字典里有两个相同的键(我把它们替换成了"key3"
):
>>> data = [ {"key1": "value1", "key2": "value2", "key3": "value3"},
... {"key1": "value4", "key2": "value5", "key3": "value3"},
... {"key1": "value1", "key2": "value8", "key3": "value3"} ]
>>>
>>> keylist = data[0].keys()
>>> mydata = dict((k,', '.join(set(map(lambda d: d[k], data)))) for k in keylist)
>>> mydata
{'key3': 'value3', 'key2': 'value5, value2, value8', 'key1': 'value4, value1'}