Python 用单引号将字典翻过来;至于;循环或使用;itertools";图书馆

Python 用单引号将字典翻过来;至于;循环或使用;itertools";图书馆,python,dictionary,itertools,Python,Dictionary,Itertools,我有一本这样的列表词典: 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', } 我想创建一个反向查找dict,如下所示: my_dict = { 'key_a': [1, 3, 4], 'key_b': [0, 2],

我有一本这样的列表词典:

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',
}
我想创建一个反向查找dict,如下所示:

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

使用字典理解的解决方案是实现它的Pythonic方法

但是,根据您的要求,作为一种针对
循环的单
替代方案,以下是使用和的功能性解决方案,但我怀疑它在可读性方面是否比您的解决方案更好:

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'} 
没有循环。很明显,它的可读性不强

另一个基于@Moinuddinkadri的想法

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

这里有一个没有显式for循环。但并不推荐(在
map
中的副作用对许多人来说都是不可能的):


那重复的钥匙呢?wins中的最后一个关键点?在这对眼睛看来,你的代码非常完美。我们可以假设列表中不会有重复的元素。这是函数式编程。你的代码是Python实现它的方法,与你用Python编写的各种嵌套单行程序相比,它非常简单。我在这里看不到任何可读性问题非常不必要地使用lambdas with
map
来删除
for
循环。但仍然是“+1”,因为OP只想减少them@MoinuddinQuadri,这是一个愚蠢的问题,但将这些想法抛诸脑后,看看会有什么样的结果会很有趣。从评论和收到的答案中可以清楚地看出,可读性不是我代码的问题。我不想删除我的问题,因为它可能对其他人有用。我会接受这个答案,因为它显示了itertools作为请求的最佳使用。map中的副作用实际上是否定的,所以只需将+0.7四舍五入即可