我有一个这样的列表字典:
var tab = window.open('about:blank', '_blank');
tab.document.write(html); // where 'html' is a variable containing your HTML
tab.document.close(); // to finish loading the page
我想创建一个这样的反向查找字典:
my_dict = {
'key_a': [1, 3, 4],
'key_b': [0, 2],
}
我有一个解决方案的工作版本:
reverse_dict = {
0: 'key_b',
1: 'key_a',
2: 'key_b',
3: 'key_a',
4: 'key_a',
}
但是想知道是否有人可以提供一个不使用双reverse_dict = {elem: key for key, a_list in my_dict.items() for elem in a_list}
的替代答案,因为我觉得它失去了可读性。所以我更喜欢使用单个for
循环或使用像itertools或函数式编程中的函数
答案 0 :(得分:3)
使用词典理解的解决方案是实现它的Pythonic方法。
但是,作为您所要求的单个for
循环的替代方案,以下是使用zip()
,itertools.repeat()
和{{3但是我怀疑它在可读性方面比你的解决方案更好:
my_dict = {
'key_a': [1, 3, 4],
'key_b': [0, 2],
}
from itertools import chain, repeat
new_dict = dict(chain.from_iterable(zip(v, repeat(k)) for k, v in my_dict.items()))
new_dict
将保留的位置:
{0: 'key_b', 1: 'key_a', 2: 'key_b', 3: 'key_a', 4: 'key_a'}
答案 1 :(得分:2)
>>> from itertools import chain
>>> dict(chain.from_iterable(map(lambda k: map(lambda j:(j, k), my_dict.get(k)), my_dict)))
{1: 'key_a', 3: 'key_a', 4: 'key_a', 0: 'key_b', 2: 'key_b'}
不用于循环。它显然没有更多的可读性
另一个基于@MoinuddinQuadri的想法
>>> from itertools import chain, repeat
>>> dict(chain.from_iterable(map(lambda k: zip(my_dict[k], repeat(k)), my_dict)))
{1: 'key_a', 3: 'key_a', 4: 'key_a', 0: 'key_b', 2: 'key_b'}
答案 2 :(得分:1)
这是一个没有明确for循环的。不过真的不推荐(map
中的副作用对许多人来说是禁忌的):
>>> import itertools as it
>>> out = {}
>>> any(map(out.update, it.starmap(dict.fromkeys, map(reversed, my_dict.items()))))
False
>>> out
{1: 'key_a', 3: 'key_a', 4: 'key_a', 0: 'key_b', 2: 'key_b'}