另一个直接的解决方案是,在Python v3.7及以上版本中保证可行:
d = {'A':'a', 'B':'b', 'C':'c', 'D':'d'}
dr = {k: d[k] for k in reversed(d)}
print(dr)
输出:
{'D': 'd', 'C': 'c', 'B': 'b', 'A': 'a'}
请注意,反转字典仍被视为与其未反转的原始版本相等,即:
(d == dr) == True
作为对某人点赞的回应,我很好奇哪种解决方案实际上更快。
像往常一样,这取决于情况。将包含10,000个项目的字典反转10,000次,使用
list
和
reversed
的解决方案更快。但是,将包含1,000,000个项目的字典反转100次(即总共反转字典中相同数量的项目,只是起始字典更大),则使用理解方式更快-读者需要找到确切的翻转点。如果您处理大型字典,则可能需要对性能进行基准测试。
from random import randint
from timeit import timeit
def f1(d):
return dict(reversed(list(d.items())))
def f2(d):
return {k: d[k] for k in reversed(d)}
def compare(n):
d = {i: randint(1, 100) for i in range(n)}
print(timeit(lambda: f1(d), number=100000000 // n))
print(timeit(lambda: f2(d), number=100000000 // n))
compare(10000)
compare(1000000)
结果(一次运行,典型结果):
4.1554735
4.7047593
8.750093200000002
6.7306311
dict
是按插入顺序排序的,就像OrderedDict
一样。OrderedDict
提供了一些额外的API来操作顺序,但对于简单的反转操作,您不需要它。 - ShadowRangerdict
总是无序的(而现代CPython已经有序超过两年了)。 - ShadowRanger