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

时间:2013-11-26 10:10:09

标签: python algorithm data-structures dictionary map

我有以下项目列表(键值对):

items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]

我想得到什么:

{
  'A' : 1,
  'B' : [1,2]
  'C' : 3
}

我天真的解决方案:

res = {}
for (k,v) in items:
     if k in res:
         res[k].append(v)
     else:
         res[k] = [v]

我正在寻找一些优化的更多pythonic解决方案,任何人?

5 个答案:

答案 0 :(得分:4)

使用可以在这里使用defaultdict。

from collections import defaultdict

res = defaultdict(list)
for (k,v) in items:
    res[k].append(v)
# Use as dict(res)

修改

这是使用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]}

下行:每个元素都是一个列表。根据需要将列表更改为生成器。


将所有单个项目列表转换为单个项目:

>>> 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)]

答案 1 :(得分:1)

如果您不想使用defaultdict / groupby,则以下情况有效:

d = {}
for k,v in items:
   d.setdefault(k, []).append(v)

答案 2 :(得分:0)

使用defaultdict非常容易,可以从collections导入。

>>> from collections import defaultdict
>>> items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]
>>> d = defaultdict(list)
>>> for k, v in items:
    d[k].append(v)
>>> d
defaultdict(<class 'list'>, {'A': [1], 'C': [3], 'B': [1, 2]})

可以也使用词典理解:

>>> d = {l: [var for key, var in items if key == l] for l in {v[0] for v in items}}
>>> d
{'A': [1], 'C': [3], 'B': [1, 2]}

答案 3 :(得分:0)

您可以使用WebOb multidict实现:

 >>> from webob import multidict
 >>> a = multidict.MultiDict(items)
 >>> a.getall('B')
 [1,2]

答案 4 :(得分:0)

也许它看起来很难看,但它确实有用。

In [1]: items = [('A', 1), ('B', 1), ('B', 2), ('C', 3)]

In [2]: d = {}

In [3]: map(lambda i: d.update({i[0]: i[1] if d.get(i[0], i[1]) == i[1] else [d[i[0]], i[1]]}), items)
Out[3]: [None, None, None, None]

In [4]: print d
{'A': 1, 'C': 3, 'B': [1, 2]}

else分支中,我们可以检查d[i[0]]是否返回列表。