首先是元组的Python数组,存储第二个

时间:2017-08-03 17:12:08

标签: python list dictionary group-by

所以我有一个像这样的元组数组

query_results = [("foo", "bar"), ("foo", "qux"), ("baz", "foo")]

我想实现类似的目标:

{
    "foo": ["bar", "qux"],
    "baz": ["foo"]
}

所以我尝试过使用这个

from itertools import groupby

grouped_results = {}
for key, y in groupby(query_results, lambda x: x[0]):
    grouped_results[key] = [y[1] for u in list(y)]

我遇到的问题是虽然键的数量是正确的,但每个数组中的值的数量都要低得多。任何人都可以解释为什么会发生这种情况以及我应该做些什么?

3 个答案:

答案 0 :(得分:5)

最好使用defaultdict

from collections import defaultdict

result = defaultdict(list)

for k,v in query_results:
    result[k].append(v)

哪个收益率:

>>> result
defaultdict(<class 'list'>, {'baz': ['foo'], 'foo': ['bar', 'qux']})

如果您希望再次将其转换为 vanilla 字典,您可以 - 在for循环后使用:

result = dict(result)

然后导致:

>>> dict(result)
{'baz': ['foo'], 'foo': ['bar', 'qux']}

defaultdict factory 构建,此处为list。如果在字典中找不到密钥,则调用工厂(list()构造一个新的空列表)。然后结果与密钥相关联。

因此,对于尚未出现在字典中的每个键k,我们将首先构建一个新列表。然后,我们在该列表上调用.append(v)以向其附加值。

答案 1 :(得分:2)

为什么不使用简单的for循环?

grouped_results = {}
for key, value in query_results:
    grouped_results.setdefault(key, []).append(value)

输出:

{'foo': ['bar', 'qux'], 'baz': ['foo']}

答案 2 :(得分:1)

如何使用defaultdict

d = defaultdict(list)
for pair in query_results:
    d[pair[0]].append(pair[1])