在python中使用逆字典简化代码



考虑一些映射my_map定义了一些键的顺序,一些字典my_dict将相同的键映射到一些值:

my_map = {'x' : 2, 'y' : 0, 'z' : 1}
my_dict = {'x' : 'foo', 'z' : 'bar', 'y' : 'baz'}

我想使用my_map定义的顺序获得my_dict值的有序列表。我到达那里的最佳方法是:

inv_map = {v: k for k, v in my_map.items()}
ordered_list = [my_dict[k] for k in [inv_map[d] for d in range(len(my_map))]]

有没有不那么笨拙的方法来做同样的事情?

您可以使用sorted函数按值排序您的地图,然后转换它:

[my_dict[k] for k in sorted(my_map, key=lambda key: my_map[key])]

至少干净一点!

让我们确保它可以工作:

>>> my_map = {'x' : 2, 'y' : 0, 'z' : 1}
>>> my_dict = {'x' : 'foo', 'z' : 'bar', 'y' : 'baz'}
>>> [my_dict[k] for k in sorted(my_map, key=lambda key: my_map[key])]
['baz', 'bar', 'foo']

在这里你可以使用dict.get:

[my_dict[k] for k in sorted(my_map, key=my_map.get)]

在行动:

>>> my_map = {'x' : 2, 'y' : 0, 'z' : 1}
>>> my_dict = {'x' : 'foo', 'z' : 'bar', 'y' : 'baz'}
>>> [my_dict[k] for k in sorted(my_map, key=my_map.get)]
['baz', 'bar', 'foo']

根据具体情况,您可以初始化最终列表并将项目传递到所需位置

result = [None] * len(my_dict)
for k, v in my_dict.items():
result[my_map[k]] = v

还有另一种变化(我认为它与已经提出的解决方案不同):

[x[1] for x in sorted(my_dict.items(), key=lambda elem: my_map[elem[0]])]

测试代码:

my_map = {'x' : 2, 'y' : 0, 'z' : 1}
my_dict = {'x' : 'foo', 'z' : 'bar', 'y' : 'baz'}
print(my_dict.items())
sorted_result=[x[1] for x in sorted(my_dict.items(), key=lambda elem: my_map[elem[0]])]
print(sorted_result)

或者有一点不同:

sorted_result=list(zip(*sorted(my_dict.items(), key=lambda elem: my_map[elem[0]])))[1]

我想使用zip()将元组列表拆分为2个列表,但在Python 3中zip()返回迭代器(不是列表),所以(如在转置/Unzip函数(zip的逆)中所建议的?)我用list()

您可以将sortedmy_dict中的值一起使用,并使用一个键函数将它们与my_map中的值进行排序

ordered_list = sorted(my_dict.values(), key=lambda s:my_map[{v: k for k, v in my_dict.items()}[s]])

如果排序错误,可以使用reverse=True

最新更新