一个列表项如何有2个索引?

时间:2017-07-13 01:54:03

标签: python python-3.x python-3.6

假设我写了一个列表:

foo=[1,2,3,4,5,6,7,8,9,1]

当我试图在1中找出foo的索引时,它会变为0.但我想在最后找到1的索引(它是期望索引是9)所以我写了这个简单的代码,它会给我列表中所有项目的所有索引:

for i in foo:
  print(foo.index(i))

结果是:

0
1
2
3
4
5
6
7
8
0

请注意,根据上面的迭代,foo中的最后一个1的索引也为零。

现在我尝试使用以下命令删除索引为9的列表项: 即使迭代证明它的索引为0,del foo[9]和最后1也会被删除!

为什么会这样?

8 个答案:

答案 0 :(得分:4)

当您使用 index()方法时,它会返回搜索项的第一个实例。 
看看这个




 >>> a = [5,4,1,3,1,2]
>>> a.index(1)
 2
  




无论你做什么和迭代多少次,这都不会改变。 
您可以使用




 作为索引,枚举中的行(foo):
打印(指数)
  



答案 1 :(得分:3)

获取所有指数:

>>> [i for i, num in enumerate(foo) if num == 1]
[0, 9]

获取最大索引:

>>> max([i for i, num in enumerate(foo) if num == 1])
9

答案 2 :(得分:2)

在Python中,如果找到某个项目,则迭代将退出,并且不会检查其他项目。

因此,如果您使用索引元素调用索引函数,则必须找到该函数。索引函数只会检索它找到的与您的参数匹配的第一个元素索引(在本例中为i)

如果您需要所有可能的索引,则需要使用list comphrehension

foo=[1,2,3,4,5,6,7,8,9,1]
bar = [i for i,x in enumerate(foo) if i == 1]
print(bar)

答案 3 :(得分:1)

让我们看一下index函数的文档:

list.index(x[, start[, end]])
     

在值为x的第一个项目的列表中返回从零开始的索引。如果没有这样的项目,则引发ValueError

因此它返回带有该值的第一个项。这就解释了为什么index(1)总是出现0。

当您使用del foo[9]时,您告诉它擦除列表中第9位的对象。虽然它与元素0具有相同的值,但它不是同一个对象。我们可以通过

来证明这一点
>>>foo[0] is foo[9]
False

这是预期的行为。仅仅因为两个对象具有相同的值并不意味着它们是同一个对象。

答案 4 :(得分:1)

index()从列表的开头搜索,并返回一次查找。所以 1 的索引是0.一个解决方案是枚举你自己。




  def index_all(lst,x):&#xA ; return [i for i,v in enumerate(lst)if v == x]

 print(index_all([1,2,3,4,5,6,7,8,9,1] ],1))
  



答案 5 :(得分:1)

问题是,你将i作为参数传递给函数索引 并且文档说index(x)“返回最小的i,使得i是第一次出现的x的索引”。 因此,每次你通过1,它将始终给出第一次出现 但请检查

foo=[1,2,3,4,5,6,7,8,9,10]
>>> for i in foo:
...   print(foo.index(i))
... 
0
1
2
3
4
5
6
7
8
9

这会产生不同的结果,因为所有元素都是不同的

答案 6 :(得分:0)

您可以尝试这种方式:

foo=[1,2,3,4,5,6,7,8,9,1]
for i, val in enumerate(foo):
    if val == 1:
        print(i)

'''
output :

0
9

'''

答案 7 :(得分:-1)

如果您不明白,请参阅以下资料来解释。

1. help(list)  
2.  
def index(self, value, start=None, stop=None): 
    """
    L.index(value, [start, [stop]]) -> integer -- return first index of value.
    Raises ValueError if the value is not present.
    """
    return 0