假设我有一个大字典d
,我想显示一些随机元素(假如我尝试__repr__
整个事情,我的终端会崩溃)。
在Python 2中,我会调用d.items()[0]
;我在Python 3中做什么...是Pythonic等价的next(iter(d.items()))
?
答案 0 :(得分:5)
两个返回值的结果实际上是等效的,对于Python 2中的d.items()[0]
和Python 3中的next(iter(d.items()))
,但这忽略了很多细微之处。
d.items()
创建列表中每个项目的列表,有效地创建字典的浅表副本。它实际上就像:
def items(self):
l = []
for k, v in self.iteritems():
l.append((k, v))
return l
这是非常低效的,因为您实际上是在复制大量项目以提取单个项目。 Python2中更有效的方法是next(d.iteritems())
。
因此,以下内容更多"逻辑上"相当于,而不是表面上等同于:
>>> # PY2
>>> d.items()[0]
>>> # PY3
>>> list(d.items())[0]
和
>>> # PY2
>>> next(d.iteritems())
>>> # PY3
>>> next(iter(d.items()))
简而言之,使用Python3版本的代码会更快,更不用说明确地执行代码所说的内容了。
正如Nathan的回答所述,在Python 3.7中,字典按插入顺序迭代,这意味着它将始终返回添加到字典中的第一个项目。
答案 1 :(得分:1)
next(iter(d.items()))
将更接近于next(d.iteritems())
;更接近你原来的list(d.items())[0]
。 (iter版本效率更高。)
然而,字典无序的事实一直是一个实现细节 - 也就是说,不能保证 - 而且recently annouced字典将在Python 3.7及更高版本中被确定性地排序(按插入顺序排列)。从那里开始,如果你想要一个大字典中的随机项目,你需要用random.choice(list(d.items()))
来解决这个问题。