![](/img/trans.png)
[英]Why do the Items in a Python ChainMap reverse order when converted to a Dictionary?
[英]Python reverse dictionary items order
假设我有一本字典:
d = {3: 'three', 2: 'two', 1: 'one'}
我想重新排列这本字典的顺序,以便字典是:
d = {1: 'one', 2: 'two', 3: 'three'}
我在想类似列表的reverse()
函数,但那没有用。 预先感谢您的回答!
从 Python 3.8 及更高版本开始,items 视图可以反向迭代,所以你可以这样做:
d = dict(reversed(d.items()))
在 3.7 和 3.6 上,他们还没有在dict
和dict
视图上实现__reversed__
( issue33462: reversible dict ),所以使用中间list
或tuple
,它们支持反向迭代:
d = {3: 'three', 2: 'two', 1: 'one'}
d = dict(reversed(list(d.items())))
在 3.6 之前, 您需要collections.OrderedDict
(用于输入和输出)才能获得所需的结果。 普通dict
直到 CPython 3.6(作为实现细节)和 Python 3.7(作为语言保证)才保留任何顺序。
标准 Python 词典(Python 3.6 之前)没有顺序,也不保证顺序。 这正是创建OrderedDict
的目的。
如果您的 Dictionary 是OrderedDict
,您可以通过以下方式反转它:
import collections
mydict = collections.OrderedDict()
mydict['1'] = 'one'
mydict['2'] = 'two'
mydict['3'] = 'three'
collections.OrderedDict(reversed(list(mydict.items())))
另一个直接的解决方案,保证适用于 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
作为对有人赞成此评论的回应,我很想知道哪种解决方案实际上更快。
像往常一样,这取决于。 使用list
和reversed
on the items 的解决方案将 10,000 项字典反转 10,000 次会更快。 但是,将包含 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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.