Создать или добавить в список в словаре - это можно сократить? - PullRequest
44 голосов
/ 10 ноября 2010

Может ли этот код Python быть сокращенным и все же читаемым с помощью itertools и наборов?

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)])

Ответы [ 3 ]

88 голосов
/ 10 ноября 2010

Альтернативой defaultdict является использование метода setdefault стандартных словарей:

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

Это зависит от того факта, что списки являются изменяемыми, поэтому то, что возвращается из setdefault, является тем же спискомкак в словаре, поэтому вы можете добавить к нему.

47 голосов
/ 10 ноября 2010

Вы можете использовать defaultdict(list).

from collections import defaultdict

result = defaultdict(list)
for widget_type, app in widgets:
    result[widget_type].append(app)
4 голосов
/ 25 марта 2013

может быть немного медленным, но работает

result = {}
for widget_type, app in widgets:
    result[widget_type] = result.get(widget_type, []) + [app]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...