假设一个字典中键是元组:
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 }
答案 0 :(得分:2)
您要查找的嵌套理解如下:
>>> 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}
答案 1 :(得分:1)
您可以像这样使用dict理解:
{k: v for t, v in D.items() for k in t}