假设我有一本字典:
d = {3: 'three', 2: 'two', 1: 'one'}我想重新排列这个字典的顺序,这样字典就是:
d = {1: 'one', 2: 'two', 3: 'three'}我在考虑类似于列表的reverse()函数,但这并不起作用。提前感谢你的回答!
发布于 2019-04-30 07:00:32
从Python 3.8及更高版本开始,items视图是可反向迭代的,因此您可以这样做:
d = dict(reversed(d.items()))在3.7和3.6中,他们还没有在dict和dict视图(issue33462: reversible dict)上实现__reversed__,所以使用中间的list或tuple,它们确实支持反向迭代:
d = {3: 'three', 2: 'two', 1: 'one'}
d = dict(reversed(list(d.items())))Pre-3.6,you'd need collections.OrderedDict (输入和输出)以达到预期的结果。在Python3.6(作为实现细节)和CPython 3.7 (作为语言保证)之前,普通的dicts没有保留任何顺序。
发布于 2019-04-30 06:56:15
标准的Python字典(Python3.6之前的版本)没有顺序,也不保证顺序。这正是创建OrderedDict的目的所在。
如果你的字典是一个OrderedDict,你可以通过:
import collections
mydict = collections.OrderedDict()
mydict['1'] = 'one'
mydict['2'] = 'two'
mydict['3'] = 'three'
collections.OrderedDict(reversed(list(mydict.items())))发布于 2020-12-29 10:31:54
另一个简单的解决方案,保证适用于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的解决方案,对10,000个条目字典进行10,000次反向查询会更快。但是,将100万个条目的词典倒排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.7306311https://stackoverflow.com/questions/55911745
复制相似问题