使用单个"反转字典"循环或使用" itertools"图书馆

时间:2018-02-27 23:19:20

标签: python dictionary itertools

我有一个这样的列表字典:

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或函数式编程中的函数

3 个答案:

答案 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'}