2013-06-18 55 views
0

为什么当我运行:遍历列表理解Python中

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)] 

所以你可能已经注意到,如果我使用范围功能,我得到一个错误的输出,但如果我在[“一”,“N”,“G”]手动密钥我得到所需的输出

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

两者显然是相同的权利?因此,为什么有不同的结果(如果他们是相同的)

基本上,我试图建立具有在逆转了一系列的999射程为999的程序,并且相信我硬编码的1000个数字是没有效率的,我可能会被认为是疯狂

+0

显然没有,thery是不一样的,范围(0,4)为[0,1,2,3] – AAlferez

+0

为什么不看'B'后设置'B = [范围( 0,4)]'? – cmd

回答

5

[range(0,4)][[0,1,2,3]]相同,所以它与[0,1,2,3,4]非常不一样。

我觉得你只是想range(0,5)(注意,是解决这个没有方括号,并以包括你需要有5range()stop论证结果4)。

并为您的具体问题:“基本上,我试图建立其在一个范围内的999拥有A程序逆转,B射程999”:

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

这是假设你想范围如[999, 998, ..., 1, 0][0, 1, ..., 998, 999]

+0

谢谢,这可能听起来对你来说是一个愚蠢的问题,但对我来说它是一个相当大的东西 –

3

不,这两个不一样。你能想到的

[range(0, 4)] 

,因为这

[[0, 1, 2, 3]] 

值得注意的是列表的列表。

所以,当你对这个列表进行列表理解时,它将一遍又一遍地遍历单个元素[0, 1, 2, 3]

4

两者显然是相同的权利?

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

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

0

显然没有,thery是不一样的,范围(0,4)是[0,1,2,3]

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

检查任何python源代码。

Link