【问题标题】:Why does a list comprehension over a zip() call return a list containing the zip object instead of a list of zip()'s return values?为什么对 zip() 调用的列表理解会返回一个包含 zip 对象的列表,而不是 zip() 的返回值列表?
【发布时间】:2020-09-27 22:44:57
【问题描述】:

使用 python3 REPL 并注意到以下内容:

为什么print( [zip([1,2,3], [3,1,4])] )print( list(zip([1,2,3], [3,1,4])) ) 不同?

第一个返回[<zip object at 0xblah>],第二个返回[(1,3), (2,1), (3,4)]

试图理解为什么第一个语句中的列表理解没有给我list() 构造函数给出的结果 - 我想我对列表理解和list() 之间的区别感到困惑,并希望深入了解幕后发生了什么。

搜索给了我this question on lists and tuples,它没有回答我的问题。

编辑:The zip() function in Python 3 上的建议问题是非常有用的背景,但没有解决我的问题中关于 列表理解列表文字之间的区别的混淆, em> 所以我更喜欢下面提交的答案更完整。

【问题讨论】:

  • 这能回答你的问题吗? The zip() function in Python 3
  • [zip([1,2,3], [3,1,4])] 不是列表理解。这是一个具有单个元素的列表文字,您通过评估表达式 zip([1,2,3], [3,1,4]) 获得的值当然是 zip 对象
  • [x] 仅表示“包含 x 的列表”,而 list(x) 表示“包含 x 元素的列表”。它们不可互换(而且它们都不是列表理解)。
  • list(x) 的等效项是 [*x],而不是 [x]。试试[*zip([1,2,3], [3,1,4])]
  • [*x] 不是列表理解。这是一个包含*x 的列表,意思是“解压x 的项目”。 [*x] 将为您提供与 list(x) 相同的结果。列表理解总是包含单词forin

标签: python python-3.x


【解决方案1】:

第一个语句不是列表推导式,列表推导式会给你同样的结果。它只是一个包含 zip 对象的列表文字:

这将是一个列表理解:

[value for value in zip([1,2,3], [3,1,4])]

上面将打印与list(zip([1, 2, 3], [3, 1, 4]))相同的内容。


一般来说,[something] 的意思是:一个包含一个元素的列表:something

另一方面,list(something) 的意思是:迭代某事物中的值,并从结果中创建一个列表。例如,您可以通过将原始对象(如数字)放入其中来查看差异:

>>> [2]
[2]
>>> list(2)
TypeError: 'int' object is not iterable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 2020-07-17
    • 1970-01-01
    相关资源
    最近更新 更多