2015-11-27 3 views
3
key_list=['number','alpha'] 
value_list=[['1','a'],['2','b']] 

Я хочу, чтобы собрать элементы в этой схеме:Как создать словарь, объединив элементы из двух списков?

dict = {} 
dict.setdefault(key_list[0],[]).append(value_list[0][0]) 
dict.setdefault(key_list[0],[]).append(value_list[1][0]) 
dict.setdefault(key_list[1],[]).append(value_list[0][1]) 
dict.setdefault(key_list[1],[]).append(value_list[1][1]) 

Как сделать это в цикле?

ответ

4

zip() поставляется в очень удобно для такого рода вещи:

key_list=['number','alpha'] 
value_list=[['1','a'],['2','b']] 
d = dict(zip(key_list, zip(*value_list))) 
print(d) 

Выходной

 
{'alpha': ('a', 'b'), 'number': ('1', '2')} 

В основном это работает при распаковке values_list так, что отдельные элементы (сами списки) передаются в качестве аргументов zip() встроенный функция. Это влияет на сбор чисел и альфа вместе. Этот новый список затем затеняется key_list, чтобы создать другой список. Наконец, словарь создается путем вызова dict() в zip-списке.

Обратите внимание, что этот код полагается на порядок элементов в value_list. Он предполагает, что числовое значение всегда предшествует альфа-значению. Он также производит словарь кортежей не содержит. Если это требование, то с помощью Dict понимания (как в ответ thefourtheye в) позволяет преобразовывать кортежи в списки как словарь построен:

key_list=['number','alpha'] 
value_list=[['1','a'],['2','b']] 
d = {k: list(v) for k, v in zip(key_list, zip(*value_list))} 
>>> print(d) 
{'alpha': ['a', 'b'], 'number': ['1', '2']} 
4

Вы можете просто zip значения values_list и затем zip результата с key_list, со словарным пониманием, как этого

>>> {k: v for k, v in zip(key_list, zip(*value_list))} 
{'alpha': ('a', 'b'), 'number': ('1', '2')} 

Вы можете понять это, шаг за шагом, как это

>>> list(zip(*value_list)) 
[('1', '2'), ('a', 'b')] 

Теперь zip пинг это с key_list даст нам

>>> list(zip(key_list, zip(*value_list))) 
[('number', ('1', '2')), ('alpha', ('a', 'b'))] 

Теперь вы можете использовать dict функцию для создания словаря, как показано mhawke,

>>> dict(zip(key_list, zip(*value_list))) 
{'alpha': ('a', 'b'), 'number': ('1', '2')} 

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

+0

Спасибо! но я не понимаю, почему существует «*» перед значением_list – Sbioer

+0

@Sbioer Он [распаковывает] (https://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists) значения 'value_list' и передает все из них в качестве параметров функции' zip'. – thefourtheye

+0

Ещё один вопрос. Как превратить этот кортеж в список? – Sbioer

Смежные вопросы