2011-02-05 48 views
0

當我執行下面的python腳本製作列表

list= (1,2,3,4,1,2,7,8) 

for number in list: 
    item1= number 
    item2= list[list.index(item1)+2] 
    couple= item1, item2 
    print couple 

的目標是每個數字與下面的第二 我得到這個結果鏈接

(1, 3) 
(2, 4) 
(3, 1) 
(4, 2) 
(1, 3) 
(2, 4) 

(然後索引獲取超出範圍,但這不是問題)

我的問題是爲什麼數字1在第五行仍然耦合到數字3,我怎麼能使它耦合到7號;在第六行同樣應該與數字8相連。

附加問題 如果我只想列出以1開頭的夫婦,我該怎麼辦:[(1,3 ),(1,7)]

+3

請不要使用內置`list`作爲變量名! – ChristopheD 2011-02-05 21:49:14

+2

這不是一個列表。用括號定義一個列表,[] abc = [1,2,3,4,1,2,7,8] – Geuis 2011-02-05 21:50:01

回答

0

您正在使用.index,它返回第一個出現的number

考慮:

for number in range(len(list)): 
    item1= list[number] 
    item2= list[number+2] 
    couple= item1, item2 
    print couple 
+0

當數字+2超出列表末尾時,會導致IndexError。 – 2011-02-05 22:22:44

+0

如果我只想列出以1開頭的夫婦,我該怎麼辦?[(1,3),(1,7)] – Preys 2011-02-06 11:06:08

1

xs.index(x)給你的xxs中第一次出現的索引。所以,當你到達第二個1時,.index會給你第一個1的索引。

如果您需要索引旁邊的值,請使用enumeratefor i, number in enumerate(numbers): print number, numbers[i+2]

請注意,我故意沒有使用名稱list。這是一個內置的名稱,你不應該覆蓋它。還要注意(..., ...)元組(因此不能更改),而不是一個列表(它是在方括號[..., ...]中定義的,可以更改)。

1

您在列表中有重複項,因此索引始終返回第一個索引。

for index in range(len(list) - 1)

+0

(1)如果您想要所有的數字將`0'改爲`len(list)`(`range`已經是半開範圍),如果你想防止出界錯誤(這不是問題的主題),你需要'-2' 。 (2)使用`enumerate`。 – delnan 2011-02-05 21:53:20

3

list.index返回第一出現在列表中值的偏離開始你的計劃 - 所以,如果你做的[1,1,1]的.index(1)中,答案將始終爲0,即使1和2也是有效答案。

相反,嘗試:

from itertools import islice, izip, ifilter 

mylist = [1,2,3,4,1,2,7,8] 
for pair in ifilter(lambda x: x[0]==1, izip(mylist, islice(mylist, 2, None))): 
    print pair 

結果

(1, 3) 
(1, 7)