在 python 中 - 如何将项目转换为字典?

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 解决方案,有人吗?

Ult*_*nct 5

这里可以使用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)