Python 2.7:附加到字典键的列表值

时间:2015-02-25 12:09:27

标签: python python-2.7

我有以下数据:

data = [(1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3)]

我想创建一个包含键列表值的字典,如何使用字典理解呢?

即:

{1: [2,3,4]
 2: [1,2,3]
}

我尝试过以下操作,但每次迭代都会覆盖列表。

{x: [y] for x,y in data}

2 个答案:

答案 0 :(得分:6)

你可以使用这个dict-comprehension:

d = {x: [v for u,v in data if u == x] for x,y in data}

但请注意,这是非常低效的,因为它将循环整个列表n+1次!

最好只使用普通的for循环:

d = {}
for x,y in data:
    d.setdefault(x, []).append(y)

或者,您也可以使用itertools.groupy(由您自己发现):

groups = itertools.groupby(sorted(data), key=lambda x: x[0])
d = {k: [g[1] for g in group] for k, group in groups}

在所有情况下,d最终都是{1: [2, 3, 4], 2: [1, 2, 3]}

答案 1 :(得分:2)

您可以使用集合模块中的defaultdict

>>> from collections import defaultdict
>>> data = [(1, 2), (1, 3), (1, 4), (2, 1), (2, 2), (2, 3)]
>>> m = defaultdict(list)
>>> for i,j in data:
        m[i].append(j)


>>> m
defaultdict(<class 'list'>, {1: [2, 3, 4], 2: [1, 2, 3]})
>>> dict(m)
{1: [2, 3, 4], 2: [1, 2, 3]}