【问题标题】:Python: What is for ... in [duplicate]Python:什么是……在[重复]
【发布时间】:2020-09-15 01:28:36
【问题描述】:

在 Python Cookbook 第三版的第 29 页,作者做了如下声明:

"... 也可以通过创建一个元组序列并将它们传递给dict() 函数来完成。例如:

p1 = dict((key, value) for key, value in prices.items() if value > 200)

作者对作为“序列”传递给dict() 构造函数的参数的引用让我想知道......究竟是什么for ... in ...?不是表情吧?不能只在 Python 解释器中输入:for x in (1,2,3) 并收到结果吗?例如,list()documentation 表明构造函数需要一个可迭代的,但我不清楚发生了什么。

【问题讨论】:

  • 你可以for x in (1,2,3):print(x) 是的,这里的可迭代对象是一个元组
  • @MichaelSilverstein 显示的示例不是推导式,尽管您可以编写与 dict 推导式相同的功能。
  • @MisterMiyagi 这不是序列in the Python sense,不。
  • @S3DEV:哎呀,谢谢你的错字。是的,应该有一个结束括号。

标签: python list dictionary iterable


【解决方案1】:
p1 = dict((key, value) for key, value in prices.items() if value > 200)

相当于:

p1 = {}
for key,value in prices.items():
    if value > 200:
        p1.update({key, value})

pricesdict,因此价格、商品将返回如下内容:

dict_items([(key1, value1), (key2, value2)])

【讨论】:

  • 为什么是昂贵的 p1.update({key, value}) 而不是便宜的 p1[key] = value -- 我看到人们这样做,但我不明白为什么。
【解决方案2】:

dict 可以使用一个可迭代的键/值对来构造一个新实例。表达式

(key, value) for key, value in prices.items() if value > 200

是一个生成器表达式;结果是一个generator 类型的值,它(迭代时)从prices.items() 中产生第二个元素大于200 的元组。

创建generator 的另一种方法是使用生成器函数:

def foo(p):
    for key, value in p.items():
        if value > 200:
            yield key, value

d = dict(foo(prices))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 2020-06-05
    • 2019-11-14
    • 2013-10-24
    • 2020-09-01
    • 1970-01-01
    • 2017-10-05
    • 2020-12-13
    相关资源
    最近更新 更多