mno*_*tka 3 python algorithm dictionary data-structures
我有以下项目列表(键值对):
items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]
Run Code Online (Sandbox Code Playgroud)
我想得到什么:
{
'A' : 1,
'B' : [1,2]
'C' : 3
}
Run Code Online (Sandbox Code Playgroud)
我的天真的解决方案:
res = {}
for (k,v) in items:
if k in res:
res[k].append(v)
else:
res[k] = [v]
Run Code Online (Sandbox Code Playgroud)
我正在寻找一些优化的更多 pythonic 解决方案,有人吗?
这里可以使用defaultdict。
from collections import defaultdict
res = defaultdict(list)
for (k,v) in items:
res[k].append(v)
# Use as dict(res)
Run Code Online (Sandbox Code Playgroud)
编辑:
这是使用 groupby,但请注意,上面的内容看起来更加干净整洁:
>>> data = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]
>>> dict([(key,list(v[1] for v in group)) for (key,group) in groupby(data, lambda x: x[0])])
{'A': [1], 'C': [3], 'B': [1, 2]}
Run Code Online (Sandbox Code Playgroud)
缺点:每个元素都是一个列表。根据需要将列表更改为生成器。
要将所有单个项目列表转换为单个项目:
>>> res = # Array of tuples, not dict
>>> res = [(key,(value[0] if len(value) == 1 else value)) for key,value in res]
>>> res
[('A', 1), ('B', [1, 2]), ('C', 3)]
Run Code Online (Sandbox Code Playgroud)