Создание dict из списка ключей, кортежей значений при сохранении дубликатов ключей

Поэтому я понял, как:

dict((x.key, x.value) for x in y) 

Проблема, конечно же, в том, что если есть несколько x.key s с одинаковым значением, они обрушиваются с последним значением x.value с тем x.key что является единственным выжившим членом. Я хочу на самом деле сделать значения получаемого dict списка:

 { 'key1': ['value1'], 'key2': ['value2', 'value3', 'value4'], 'key3': ['value5'], # etc. } 

Возможна ли эта логика с пониманием?

3 Solutions collect form web for “Создание dict из списка ключей, кортежей значений при сохранении дубликатов ключей”

Вы можете добавлять элементы по одному в словарь, который содержит пустые списки по умолчанию:

 import collections result_dict = collections.defaultdict(list) for x in y: result_dict[x.key].append(x.value) 

Вы также можете сделать что-то очень похожее, не используя модуль коллекций:

 result_dict = {} for x in y: result_dict.setdefault(x.key, []).append(x.value) 

но это, возможно, немного менее разборчиво.

Эквивалентный, более разборчивый (не нужно «разбирать» менее распространенное setdefault ), но более пешеходный, базовый подход Python:

 result_dict = {} for x in y: if x.key not in result_dict: result_dict[x.key] = [] result_dict[x.key].append(x.value) 

Первое решение явно предпочтительнее, так как оно в то же время кратким, разборчивым и быстрым.

Неа. Вы не можете сделать это в понимании.

Но вы можете использовать itertools.groupby .

Я не говорю, что это правильная вещь, но, просто из чистого интеллектуального любопытства.

Вы можете использовать itertools.groupby и lambda чтобы сделать это в одном понимании, если это то, что вы действительно хотите сделать: (где l – список кортежей, из которых вы хотите сделать dict :

 dict((k, [v[1] for v in vs]) for (k, vs) in itertools.groupby(l, lambda x: x[0])) 
  • Несколько логических сравнений в одной строке для оператора if
  • Не могу установить пульт с PyCharm
  • как найти слова, которые составлены из письма, точно сталкиваются друг с другом? (python)
  • Доступ к переменным экземпляра Python с __dict __- Неправильно ли это?
  • Хотя однострочный контур цикла
  • Что означают * и ** перед значением переменной в подписи функции?
  • Найти, к каким другим типам python можно преобразовать объект?
  • Простой способ группировки предметов в ведра
  • Python - лучший язык программирования в мире.