相当于Python 3中的字典d.items()[0]

时间:2018-01-17 05:56:06

标签: python python-3.x

假设我有一个大字典d,我想显示一些随机元素(假如我尝试__repr__整个事情,我的终端会崩溃)。

在Python 2中,我会调用d.items()[0];我在Python 3中做什么...是Pythonic等价的next(iter(d.items()))

2 个答案:

答案 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)

在Python 2中,

next(iter(d.items()))将更接近于next(d.iteritems());更接近你原来的list(d.items())[0]。 (iter版本效率更高。)

然而,字典无序的事实一直是一个实现细节 - 也就是说,不能保证 - 而且recently annouced字典将在Python 3.7及更高版本中被确定性地排序(按插入顺序排列)。从那里开始,如果你想要一个大字典中的随机项目,你需要用random.choice(list(d.items()))来解决这个问题。