【发布时间】:2020-12-14 15:40:22
【问题描述】:
我发现自己经常重复以下代码(或类似代码):
users = {}
for d in data:
if d['user'] in users.keys():
users[d['user']].append(d)
else:
users[d['user']] = [d]
在这里,data 是一个字典列表,我想将列表拆分为较小的列表,映射到它们的 d["user"] 值作为字典中的键。
我想要一种在一行中执行此操作的方法,因为这些多行让我很烦。
然而,我能想到的唯一方法是将我的 O(N) 算法(上图)更改为 O(N^2) 算法,例如:
users = {d["user"]: [d for d in data if d["user"] == u] for d in data}
显然,这种低效率是不可接受的......
【问题讨论】:
-
您可以使用 defaultdict 而不是字典,这样可以节省 if。除此之外,没有高性能(和可读)的方法来做到这一点。另一种方法是排序和分组,优于 O(n^2) 但不是 O(n)
标签: python list performance dictionary one-liner