Распаковка ключей кортежа словаря в отдельные ключи с использованием словарного понимания в Python - PullRequest
0 голосов
/ 16 ноября 2018

Предполагая словарь, где ключи являются кортежами:

D = {
    ('a','b') : 1,
    ('x','y','z') : 2
}

Как разделить каждый ключ-кортеж на отдельные ключи с одинаковым значением:

N = {
    'a' : 1, 'b' : 1,
    'x' : 2, 'y' : 2, 'z' : 2
}

В одном словарном понимании. Я набросал следующую строку, но мне интересно, можно ли ее сократить, а не создавать список значений прокси той же длины, что и кортеж ключа.

N = { k:v for s in ( zip(keys,[value]*len(keys)) for keys,value in D.items() ) for k,v in s }

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

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

{k: v for t, v in D.items() for k in t}
0 голосов
/ 16 ноября 2018

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

>>> D = {
...:    ('a','b') : 1,
...:    ('x','y','z') : 2
...:}
>>> 
>>> {k_i:v for k, v in D.items() for k_i in k}
>>> {'a': 1, 'b': 1, 'x': 2, 'y': 2, 'z': 2}

, который можно записать с помощью традиционных for циклов, таких как:

>>> result = {}
>>> for k, v in D.items():
...:    for k_i in k:
...:        result[k_i] = v
...:        
>>> result
>>> {'a': 1, 'b': 1, 'x': 2, 'y': 2, 'z': 2}

Бонус: itertoolsзлоупотреблять!

>>> from itertools import repeat, chain
>>> dict(chain.from_iterable(zip(k, repeat(v)) for k, v in D.items()))
>>> {'a': 1, 'b': 1, 'x': 2, 'y': 2, 'z': 2}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...