Вложенный список для dict
Я пытаюсь создать dict
вложенным list
:
groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
L = [{y:x[0] for y in x if y != x[0]} for x in groups]
d = { k: v for d in L for k, v in d.items()}
print (d)
{'B': 'Group1', 'C': 'Group2', 'D': 'Group2', 'A': 'Group1'}
Но это кажется немного сложным.
Есть ли лучшее решение?
Ответы
Ответ 1
Как насчет:
d = {k:row[0] for row in groups for k in row[1:]}
Это дает:
>>> {k:row[0] for row in groups for k in row[1:]}
{'D': 'Group2', 'B': 'Group1', 'C': 'Group2', 'A': 'Group1'}
Итак, вы перебираете каждый row
в groups
. Первый элемент строки берется как значение (row[0]
), и вы выполняете итерацию по row[1:]
, чтобы получить все ключи k
.
Как ни странно, это выражение также работает, когда вы даете ему пустую строку (например, groups = [[],['A','B']]
). Это потому, что row[1:]
будет пустым и, следовательно, часть row[0]
никогда не будет оценена:
>>> groups = [[],['A','B']]
>>> {k:row[0] for row in groups for k in row[1:]}
{'B': 'A'}
Ответ 2
Это, по сути, более красивая версия Виллема:
>>> groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
>>> {k:g for g,*tail in groups for k in tail}
{'B': 'Group1', 'A': 'Group1', 'C': 'Group2', 'D': 'Group2'}
Но он не будет работать с пустым списком: groups = [[],['A','B']]
>>> {k:head for head, *tail in grps for k in tail}
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <dictcomp>
ValueError: not enough values to unpack (expected at least 1, got 0)
Ответ 3
Я думаю, что однолинейное решение - это путаница. Я бы написал код, как показано ниже
groups = [['Group1', 'A', 'B'], ['Group2', 'C', 'D']]
result = {}
for group in groups:
for item in group[1:]:
result[item] = group[0]
print result
Ответ 4
Мне также нравится решение Виллема, но только для полноты...
другое изменение, использующее itertools и функцию генератора (только Python 3.x)
def pairs(groups):
for value,*keys in groups:
for key_value in zip(keys, itertools.repeat(value)):
yield key_value
dict(pairs(groups))
{'A': 'Group1', 'B': 'Group1', 'C': 'Group2', 'D': 'Group2'}