【问题标题】:Equivalent to dictionary d.items()[0] in Python 3 [duplicate]相当于 Python 3 中的字典 d.items()[0] [重复]
【发布时间】:2018-01-17 05:56:05
【问题描述】:

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

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

【问题讨论】:

  • 定义some random element
  • 我的意思是任何我不在乎的元素
  • 好吧,d.popitem() 将从字典中删除一个项目,但与.items() 相比,我认为会相当快,即使您必须重新插入密钥。

标签: python python-3.x


【解决方案1】:

对于 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 中,字典按插入顺序进行迭代,这意味着这将始终返回添加到字典中的第一项。

【讨论】:

    【解决方案2】:

    next(iter(d.items())) 将更接近于 Python 2 中的 next(d.iteritems());更接近您的原件的是list(d.items())[0]。 (iter 版本都更高效。)

    然而,字典是无序的这一事实一直是一个实现细节——也就是说,不能保证——在 Python 3.7 及更高版本中,字典将被确定地排序(按插入顺序)是recently annouced。从那里开始,如果您想从大字典中随机获取一个项目,则需要通过random.choice(list(d.items())) 来获取它。

    【讨论】:

    • 感谢您的更正,@AlexanderHuszagh :)
    • 我删除了我的评论并在看到更正后投了赞成票:D。很好的答案。
    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多