迭代python中的列表理解

时间:2013-06-18 15:55:30

标签: python python-2.7

为什么我跑的时候:

a = ['a','n','g']
b = [range(0,4)]

print [(x,y) for x in a for y in b]

返回:

[('a', [0, 1, 2, 3]), ('n', [0, 1, 2, 3]), ('g', [0, 1, 2, 3])]

但是当我运行这段代码时:

a = ['a','n','g']
b = [0,1,2,3,4]

print [(x,y) for x in a for y in b]

它返回:

[('a', 0), ('a', 1), ('a', 2), ('a', 3), ('a', 4), ('n', 0), ('n', 1), ('n', 2), ('n', 3), ('n', 4), ('g', 0), ('g', 1), ('g', 2), ('g', 3), ('g', 4)]

你可能已经注意到了,如果我使用范围功能,输出错误但如果我手动键入 ['a','n','g'] 我得到期望的输出

b = [range(0,4)]
and
b = [0,1,2,3,4]

两者显然是一样的吗?那么为什么结果会有所不同(如果它们是相同的)

我基本上正在尝试构建一个程序,其中 A 的范围为999反转, B 范围为999,相信我硬编码这1000个数字效率不高,我可能会被认为是疯了

4 个答案:

答案 0 :(得分:5)

[range(0,4)][[0,1,2,3]]相同,因此与[0,1,2,3,4]非常不同。

我认为您只需要range(0,5)(请注意,此处没有方括号,并且要在结果中包含4,您需要5 stop } range()}的参数。

并针对您的具体问题:“我基本上是在尝试构建一个程序,其中A的范围为999,反之为B,范围为999”:

A = range(999, -1, -1)
B = range(1000)

这假定您需要[999, 998, ..., 1, 0][0, 1, ..., 998, 999]等范围。

答案 1 :(得分:4)

  

两者显然是一样的吗?

>>> [1, 2, 3, 4]
[1, 2, 3, 4]
>>> [range(0,4)]
[[0, 1, 2, 3]]

两者不一样;你可能意味着b = range(0,4)没有额外的括号。

答案 2 :(得分:3)

不,这两个不一样。你可以想到

[range(0, 4)]

这个

[[0, 1, 2, 3]]

请注意,它是一个列表清单。

因此,当您对此列表进行列表理解时,它将一遍又一遍地遍历单个元素[0, 1, 2, 3]

答案 3 :(得分:0)

显然不,它们不一样,范围(0,4)是[0,1,2,3]

注意不同于:[range(0,4)]和[[0,1,2,3]]

检查任何python源。

Link