所以我有一个像这样的元组数组
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)]
我遇到的问题是虽然键的数量是正确的,但每个数组中的值的数量都要低得多。任何人都可以解释为什么会发生这种情况以及我应该做些什么?
答案 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])