在词典中创建或附加一个列表——这个列表可以缩短吗?

这段 Python 代码是否可以使用 itertools 和 set 来缩短并保持可读性?

result = {}
for widget_type, app in widgets:
if widget_type not in result:
result[widget_type] = []
result[widget_type].append(app)

我只能想到这一点:

widget_types = zip(*widgets)[0]
dict([k, [v for w, v in widgets if w == k]) for k in set(widget_types)])
35043 次浏览

你可以使用 defaultdict(list)

from collections import defaultdict


result = defaultdict(list)
for widget_type, app in widgets:
result[widget_type].append(app)

defaultdict的一个替代方法是使用标准字典的 setdefault方法:

 result = {}
for widget_type, app in widgets:
result.setdefault(widget_type, []).append(app)

这依赖于列表是可变的这一事实,因此从 setdefault 返回的列表与字典中的列表相同,因此您可以将其追加。

可能有点慢,但是很有效

result = {}
for widget_type, app in widgets:
result[widget_type] = result.get(widget_type, []) + [app]