Распаковать вложенный список в словарь

#python #dictionary #nested-lists

#python #словарь #вложенные списки

Вопрос:

Я пытаюсь создать словарь, как показано ниже. Что я хочу сделать, это:

 NestedList = [["key1","key2"],["val1a","val2a"],["val1b","val2b"]]

mydict = {a:{b:c} for a,b,c in NestedList}
print mydict

Runtime error (ValueErrorException): need more than 2 values to unpack
  

Это не работает, поскольку требуется распаковать первый список в a, b, c, а не распаковывать первый индекс каждого списка в a, b, c. Что работает, так это:

 mydict = {a:{b:c} for a,b,c in zip(NestedList[0],NestedList[1],NestedList[2])}
print mydict

{'key1': {'val1a': 'val1b'}, 'key2': {'val2a': 'val2b'}}
  

Однако я не хочу распаковывать вложенный список, как указано выше. Как мне переписать это, чтобы избежать распаковки и архивирования?

N.B Я могу избежать этого в данном случае, переопределив свой вложенный список, однако в целом вопрос остается в силе — как мне это сделать, когда я не могу просто переписать свой список ввода?

Комментарии:

1. Почему бы просто не проиндексировать вложенный список напрямую и не прочитать значения? NestedList Предполагается, что это произвольный длинный список, который повторяется каждые 3 кортежа?

2. Для каждого ключа может быть любое количество ключей и несколько значений. Я предполагаю, что мой вопрос действительно касается транспонирования матрицы, что, как я выяснил, я могу сделать с помощью метода zip (* NestedList)

Ответ №1:

что примерно:

 NestedList = [["key1","key2"],["val1a","val2a"],["val1b","val2b"]]
mydict = {a:{b:c} for a,b,c in zip(*NestedList)}
print(mydict)
  

Комментарии:

1. Бинго. Я на самом деле сам понял это об отделе кадров после публикации этого вопроса, но подумал, что было бы полезно, если кто-нибудь еще столкнется с этой проблемой, поскольку я нигде не смог найти похожих вопросов.