如何解决python 3.x 中不同列表推导式的输出
我正在研究 Python 中的列表理解,但我很困惑为什么这两个代码会产生不同的输出。 代码:
AppDomain.CurrentDomain
输出:
print([(letter,num) for letter in 'abc' for num in range(2)])
print([((letter,num) for letter in 'abc') for num in range(2)])
解决方法
第一个例子:
print([(letter,num) for letter in 'abc' for num in range(2)])
打印一个列表(由于外部 []
括号),其中包含每个值的 letter,num
和 letter
的所有元组(由于 num
周围的括号) letter
循环 'abc'
和 num
的每个值循环 range(2)
返回的生成器的每个值(这将是 0
和 {{1} }).
由于 Python 将第一个 1
作为外循环,因此您会看到 for
等而不是 ('a',0),('a',1),
等
但是,当您在 ('a',('b',
表达式(如 for
)周围添加括号时,您不再执行推导式中的循环,而是捕获生成器(准备开始生成它们的值,但实际上并没有将值转化为理解)。
所以:
(letter,num) for letter in 'abc'
这里,print([((letter,num) for letter in 'abc') for num in range(2)])
只是一个生成器,一旦您开始请求它们就会产生值。
注意:因为 ((letter,num) for letter in 'abc')
的值没有单独包含在生成器中,如果你对它们做一些事情,你可能会看到一个令人惊讶的结果:
num
结果:
x = [((letter,num) for letter in 'abc') for num in range(2)]
print(next(x[0]))
print(next(x[0]))
print(next(x[0]))
print(next(x[1]))
print(next(x[1]))
print(next(x[1]))
,
第一个列表推导式相当于嵌套循环:
result = []
for num in range(2):
for letter in 'abc':
result.append((letter,num))
print(result)
嵌套循环的每次迭代都会产生结果列表的一个元素。
第二个相当于一个循环:
result = []
for num in range(2):
result.append((letter,num) for letter in 'abc')
print(result)
循环的每次迭代都会将一个生成器对象附加到结果列表中。
您可以使用嵌套列表推导式,但结果将是嵌套列表,而不是第一个版本中的平面列表。
print([list((letter,num) for letter in 'abc') for num in range(2)])
# output: [[('a',('c',0)],[('a',1)]]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。