这个Python代码是否可以缩短,并且仍然可以使用itertools和sets进行读取?
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)])
答案 0 :(得分:85)
defaultdict
的替代方法是使用标准词典的setdefault
方法:
result = {}
for widget_type, app in widgets:
result.setdefault(widget_type, []).append(app)
这取决于列表是可变的这一事实,因此从setdefault返回的内容与字典中的列表相同,因此您可以附加到它。
答案 1 :(得分:47)
您可以使用defaultdict(list)
。
from collections import defaultdict
result = defaultdict(list)
for widget_type, app in widgets:
result[widget_type].append(app)
答案 2 :(得分:4)
可能有点慢,但有效
result = {}
for widget_type, app in widgets:
result[widget_type] = result.get(widget_type, []) + [app]