Create or append to a list in a dictionary – can this be shortened?

Question:

Can this Python code be shortened and still be readable using itertools and sets?

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

I can think of this only:

widget_types = zip(*widgets)[0]
dict([k, [v for w, v in widgets if w == k]) for k in set(widget_types)])
Asked By: culebrón

||

Answers:

You can use a defaultdict(list).

from collections import defaultdict

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

An alternative to defaultdict is to use the setdefault method of standard dictionaries:

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

This relies on the fact that lists are mutable, so what is returned from setdefault is the same list as the one in the dictionary, therefore you can append to it.

Answered By: Daniel Roseman

may be a bit slow but works

result = {}
for widget_type, app in widgets:
    result[widget_type] = result.get(widget_type, []) + [app]
Answered By: user1139002
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.