繁体   English   中英

Python反向字典项目顺序

[英]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 上,他们还没有在dictdict视图上实现__reversed__issue33462: reversible dict ),所以使用中间listtuple ,它们支持反向迭代:

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

作为对有人赞成此评论的回应,我很想知道哪种解决方案实际上更快。

像往常一样,这取决于。 使用listreversed 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM