创建或附加到字典中的列表 - 这可以缩短吗?

cul*_*rón 50 python dictionary

这个Python代码可以缩短,并且仍然可以使用itertools和sets读取吗?

result = {}
for widget_type, app in widgets:
    if widget_type not in result:
        result[widget_type] = []
    result[widget_type].append(app)
Run Code Online (Sandbox Code Playgroud)

我只能想到这个:

widget_types = zip(*widgets)[0]
dict([k, [v for w, v in widgets if w == k]) for k in set(widget_types)])
Run Code Online (Sandbox Code Playgroud)

Dan*_*man 94

另一种方法defaultdict是使用setdefault标准词典的方法:

 result = {}
 for widget_type, app in widgets:
     result.setdefault(widget_type, []).append(app)
Run Code Online (Sandbox Code Playgroud)

这取决于列表是可变的这一事实,因此从setdefault返回的是与字典中的列表相同的列表,因此您可以附加到它.

  • 这就是我今天要学习的Python块。谢谢,丹尼尔。:) (2认同)

Mar*_*ers 55

你可以使用defaultdict(list).

from collections import defaultdict

result = defaultdict(list)
for widget_type, app in widgets:
    result[widget_type].append(app)
Run Code Online (Sandbox Code Playgroud)

  • +1 如 https://docs.python.org/3.7/library/collections.html#defaultdict-objects 中所述:*此技术比使用 `dict.setdefault()` 的等效技术更简单、更快* (4认同)

小智 6

可能有点慢但有效

result = {}
for widget_type, app in widgets:
    result[widget_type] = result.get(widget_type, []) + [app]
Run Code Online (Sandbox Code Playgroud)

  • 它会更慢,因为 concat 运算符 (+) 每次都会创建一个新列表,而 append() 会将元素添加到现有列表中。 (3认同)