2013-03-16 69 views
1

來自R,這很難理解。從列表中獲取元素從位置0開始。 問題是,使用一個列表從另一個列表中選擇項目在這裏沒有以相同的速度運行。指數在另一個使用一個列表索引不同步

list1 = [1,2,3,4] 

list2 = [1,2,3,4] 

for x in range(0, len(list1)): 
    print(list1[list2[x]]) 

這將導致:

>> 2 
>> 3 
>> 4 
>> IndexError: list index out of range 

當我把一個附加項目,在列表1開始,並增加了一個項目,在列表2月底,這個問題停止(僅僅是因爲他們不像這樣同步)。

很明顯,我對語言還不熟悉,使用一個列表中的值從另一個列表中選擇值的正確方法是什麼?

這是正確的想法嗎?

for x in range(0, len(list1)): 
    print(list1[list2[x]-1]) 

回答

2

Python是基於0索引的。 seq[0]seq中的第一個元素。

R是基於1指數的。

所以,是的,在Python中,你可以使用

list1 = [1,2,3,4] 
list2 = [1,2,3,4] 
for x in range(0, len(list2)): 
    print(list1[list2[x]-1]) 
  • 範圍應該上升到len(list2),不len(list1)
  • 另外,range(0, len(list2))range(len(list2))相同。當 range僅傳遞一個參數時,它將被解釋爲stop 值,默認情況下開始值爲0。

注意,在Python

for x in range(...): 

往往是可以避免的,並且如果是這樣,是優選的。相反,你可以寫

for item in list2: 
    print(list1[item-1])  

item將在list2被分配到每個項目。

+0

非常豐富的信息,正是我一直在尋找的!謝謝。 – PascalVKooten 2013-03-16 22:21:05

+0

雖然沒有逃脫醜陋的'-1',對於使用python的人來說這很正常嗎? – PascalVKooten 2013-03-16 22:21:55

+0

我們建立了'list2',其中的值少一個,因此不需要減去一個。這是一個自我一致的系統,就像'R's'索引是自我一致的。只有在從一個系統轉換到另一個系統時纔會出現問題。 Edsger Dijkstra撰寫了[爲什麼基於0的索引更可取]的論點(http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF)。 – unutbu 2013-03-16 22:25:50

1

如果您的列表有4個項目,您的索引必須從0運行到3,所以使用值4會引發錯誤。以下是一個可能使其更清晰的字母示例:

list1 = [0,2,1,3] 
list2 = ['a','a','d','m'] 

for x in list1: 
    print(list2[x]), 

=> a d a m 
相關問題