2013-03-16 71 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 
相关问题