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 withmap
来删除for
循环。但仍然是“+1”,因为OP只想减少them@MoinuddinQuadri,这是一个愚蠢的问题,但将这些想法抛诸脑后,看看会有什么样的结果会很有趣。从评论和收到的答案中可以清楚地看出,可读性不是我代码的问题。我不想删除我的问题,因为它可能对其他人有用。我会接受这个答案,因为它显示了itertools作为请求的最佳使用。map中的副作用实际上是否定的,所以只需将+0.7四舍五入即可