Вложенный список для 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'}