#python #python-3.x
Вопрос:
Я вытаскиваю из своей базы данных кучу строк, многие из которых имеют одинаковый идентификатор. Я хочу сгруппировать объекты с одинаковым идентификатором в список и создать карту, которая сопоставляет идентификатор со списком результатов. У меня есть следующий код, но, похоже, должен быть более простой способ сделать это с reduce
помощью понимания словаря или понимания словаря:
result = {}
for row in rows:
type_id = row['type_id']
values = result.get(type_id, [])
values.append(row)
result[type_id] = values
Комментарии:
1. Как насчет диктатора по умолчанию?
2. Пожалуйста, обновите образец строк.
3. Это примерно все, что вы получите. Эти типы запросов агрегации всегда требуют цикла. Понимание обычно работает, когда выход представляет собой отфильтрованный список всех комбинаций входных данных. Но когда вам нужно объединить несколько входов, чтобы сделать один выход, вам нужен цикл. Чего бы это ни стоило , последние три строки можно заменить на
result.setdefault(type_id, []).append(row)
Ответ №1:
collections.defaultdict
это твой друг.
collections.defaultdict(list)
будет автоматически создавать новые list
s для каждого ключа при индексировании в defaultdict, поэтому все, что вам нужно, это:
import collections
result = collections.defaultdict(list)
for row in rows:
result[row['type_id']].append(row)
Ответ №2:
кстати, если вы просите о понимании одной строки. Не уверен насчет «более простой» части, хотя =)
{type_id:[row for row in rows if row["type_id"] == type_id] for type_id in set(row["type_id"] for row in rows)}