Я чувствую, что Python должен иметь встроенную функцию для этого. Возьмите список элементов и переведите их в словарь, сопоставляющий ключи со списком элементов с этим общим ключом.Группировка элементов ключом?
Это достаточно легко сделать:
# using defaultdict
lookup = collections.defaultdict(list)
for item in items:
lookup[key(item)].append(item)
# or, using plain dict
lookup = {}
for item in items:
lookup.setdefault(key(item), []).append(item)
Но это довольно часто в прецеденте, что встроенная функция будет хорошо. Я мог бы реализовать это сам, как таковой:
def grouped(iterable, key):
result = {}
for item in iterable:
result.setdefault(key(item), []).append(item)
return result
lookup = grouped(items, key)
Это отличается от itertools.groupby
в нескольких важных направлениях. Для того, чтобы получить тот же результат с groupby
, вы должны сделать это, что немного некрасиво:
lookup = dict((k, list(v)) for k, v in groupby(sorted(items, key=key), key))
Некоторые примеры:
>>> items = range(10)
>>> grouped(items, lambda x: x % 2)
{0: [0, 2, 4, 6, 8], 1: [1, 3, 5, 7, 9]}
>>> items = 'hello stack overflow how are you'.split()
>>> grouped(items, len)
{8: ['overflow'], 3: ['how', 'are', 'you'], 5: ['hello', 'stack']}
Есть ли лучший способ?
Я не вижу, как это «достаточно часто используется для использования». Я использую его редко, и когда мне нужно, использование 'defaultdict' просто идеально. AFAIK нет встроенного, который делает то, что вы хотите сам по себе. – Bakuriu
Возможно, вы правы, но часть меня думает, что это так же справедливо для встроенного, как groupby. – FogleBird