Как сделать словарь из двух вложенных списков? - PullRequest
2 голосов
/ 07 июня 2019

У меня есть два вложенных списка:

list1 = [['s0'], ['s1'], ['s2']]
list2 = [['hello','world','the'],['as','per','the'],['assets','order']]

, и я хочу создать словарь из этих списков с ключами от list1 и значениями от list2:

d = {s0:['hello','world','the'],s1:['as','per','the'],s2:['assets','order']}

Вывод должен выглядеть следующим образом:

d = {s0:['hello','world','the'],s1:['as','per','the'],s2:['assets','order']}

Следующий код работает, если list1 является обычным (не вложенным) списком.Но это не работает, когда list1 является вложенным списком.

dict(zip(list1, list2))

Ответы [ 4 ]

6 голосов
/ 07 июня 2019

Проблема здесь в том, что списки не являются хешируемыми , поэтому вы можете сделать одну вещь, чтобы сгладить ваш список с помощью itertools.chain, а затем построить словарь со строками (которые являются неизменяемыми) в качестве ключей после вашего текущего подхода (более подробное объяснение по этой теме см. здесь ):

from itertools import chain

dict(zip(chain.from_iterable(list1),list2))

{'s0': ['hello', 'world', 'the'],
 's1': ['as', 'per', 'the'],
 's2': ['assets', 'order']}
2 голосов
/ 07 июня 2019

Другим ответом может быть:

list1 = [['s0'], ['s1'], ['s2']]
list2 = [['hello','world','the'],['as','per','the'],['assets','order']]
output_dict = {element1[0]: element2 for element1, element2 in zip(list1, list2)}

Подобный способ этого понимания:

output_dict = {element1: element2 for [element1], element2 in zip(list1, list2)}

Вывод:

{'s0': ['hello', 'world', 'the'],
 's1': ['as', 'per', 'the'],
 's2': ['assets', 'order']}

2 голосов
/ 07 июня 2019

Если вы хотите сделать это вручную (чтобы понять алгоритм для примера), вот способ сделать это:

list1 = [['s0'], ['s1'], ['s2']]
list2 = [['hello','world','the'],['as','per','the'],['assets','order']]

if len(list1) != len(list2):
    exit(-1)

res = {}
for index, content in enumerate(list1):
    res[content[0]] = list2[index]

print(res)
0 голосов
/ 07 июня 2019

Во-первых, это странный способ хранения соответствующей информации, но я бы скомбинировал ее так:

list1 = [['s0'], ['s1'], ['s2']]
list2 = [['hello','world','the'],['as','per','the'],['assets','order']]

assert(len(list1) == len(list2))
output_dict = dict()
for index in range(len(list1)):
    output_dict[list1[index][0] = list2[index]

результат:

{'s0': ['hello', 'world', 'the'], 's1': ['as', 'per', 'the'], 's2': ['assets', 'order']}

Я предполагаю, что переменныеs0, s1 и s2 должны быть строками, как в первом списке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...