2013-06-18 54 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