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

Dee*_*pak 3 python dictionary group-by list

所以我有一系列这样的元组

query_results = [("foo", "bar"), ("foo", "qux"), ("baz", "foo")]
Run Code Online (Sandbox Code Playgroud)

我希望实现以下目标:

{
    "foo": ["bar", "qux"],
    "baz": ["foo"]
}
Run Code Online (Sandbox Code Playgroud)

所以我尝试过使用它

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)]
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是虽然键的数量是正确的,但每个数组中的值的数量远远低于它应该的数量.谁能解释为什么会发生这种情况以及我应该做些什么?

Wil*_*sem 5

你最好用defaultdict这个:

from collections import defaultdict

result = defaultdict(list)

for k,v in query_results:
    result[k].append(v)
Run Code Online (Sandbox Code Playgroud)

产量:

>>> result
defaultdict(<class 'list'>, {'baz': ['foo'], 'foo': ['bar', 'qux']})
Run Code Online (Sandbox Code Playgroud)

如果你想再把它变成一个香草词典,你可以 - 在for循环之后 - 使用:

result = dict(result)
Run Code Online (Sandbox Code Playgroud)

这导致:

>>> dict(result)
{'baz': ['foo'], 'foo': ['bar', 'qux']}
Run Code Online (Sandbox Code Playgroud)

A 在这里defaultdict建有工厂list.如果在字典中找不到密钥,则调用工厂(list()构造新的空列表).然后结果与密钥相关联.

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

  • @SamChats:因为它更优雅,并且如果有人想要使用集合而不是列表,则更容易更改.您的代码构造了很多立即省略的空列表.此外,列表追加"+"在*O(n)*中起作用,使得算法*O(n ^ 2)*. (2认同)
  • @SamChats没有!`+`是一个线性运算,所以如果它在一个循环中你总体上有O(n ^ 2).`.append`是*常数时间*,因此在循环内部,它是整体线性的. (2认同)