从文档:
反转(seq)
返回反向iterator
。seq必须是具有__reversed__()
方法或支持序列协议的对象(该__len__()
方法和__getitem__()
整数参数从0开始的方法)。
一个dict
对象没有实现__reversed__
。它确实实现了后两种方法。但是,__getitem__
将键作为参数而不是整数(从0开始)作为参数。
至于为什么,这已经在这里提出和讨论了。
编辑:
这些引号来自Python-Dev邮件列表(线程“为dict添加__reversed__方法”,始于25. 05. 18),我将从“概念性”参数开始,第一个来自Antoine Pitrou:
OrderedDict已经支持reversed()毫无价值。该论点有两种可能:
dict现在类似于OrderedDict,因此它也应该支持reversed()。
您可以使用OrderedDict明确表示您关心订购;无需添加任何内容即可。
我的想法是,保证常规词典的插入顺序是全新的,因此该概念要花一段时间才能融入词典,成为日常思考的一部分。一旦发生这种情况,可能不可避免会出现用例,并在某个时候添加__reversed__。该实现似乎很简单,并且期望有限的有序集合是可逆的并不是很大的概念飞跃。
随后是Raymond Hettinger的回复:
鉴于该命令现在可以跟踪插入顺序,因此想知道最近的插入(即遍历任务命令中最新添加的任务)似乎是合理的。其他可能的用例可能与我们使用Unix tail命令的方式相对应。
如果出现了这些用例,那么已经支持__reversed__很好,这样人们就不会试图通过popitem()调用并重新插入来实现丑陋的解决方法。
邮件列表中表达的主要关注点是,至少在某些实现中,这会增加过多的膨胀或降低内存效率(必须具有双链表而不是单链表),这是Inada Naoki引用Python Bug Tracker的话(发行33462)):
“下订单”并不意味着“可逆”。例如,单个链表是有序的,但不可逆。
虽然CPython实现可以提供有效的__reverse__
,但添加__reverse__
意味着所有 Python实现都可以提供它。例如,某些Python实现可能能够使用hashmap +单个链表实现dict。如果__reverse__
添加了,就不可能了。
返回邮件列表,这是最后两条消息(均发布于08.06.2018)。首先是迈克尔·塞里克(Michael Selik):
我的说法是对v3.8的共识是+1吗?
该线程的最后一点是INADA Naoki研究了各种实现,并确定可以在3.8中包括此功能。据我了解,Guido同意INADA的建议,等待MicroPython实现v3.7。由于INADA改变了主意,我猜这一切都对吗?
总结Guido van Rossum的信息:
对我来说听起来不错。在这种情况下,我们将有两个版本:
如其他答案和评论中所述,reversed()
自3.8(14.10.2018)版本以来,字典和字典视图均受支持。
dict
对象进行排序(至少不能从语言中保证),所以reversed
也没有任何意义