如何在列表中获取项目的位置?

时间:2008-12-13 01:20:33

标签: python list

我在列表上进行迭代,如果符合某个条件,我想打印出项目的索引。我该怎么做?

示例:

testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
    if item == 1:
        print position

12 个答案:

答案 0 :(得分:260)

嗯。这里有一个列表理解答案,但它已经消失了。

下面:

 [i for i,x in enumerate(testlist) if x == 1]

示例:

>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]

更新

好的,你想要一个生成器表达式,我们将有一个生成器表达式。这里是for循环中的列表理解:

>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
...     print i
... 
0
5
7

现在我们将构建一个生成器...

>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
...     print i
... 
0
5
7

并且足够好,我们可以将它分配给变量,并从那里使用它......

>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
... 
0
5
7

并认为我曾经写过FORTRAN。

答案 1 :(得分:148)

以下情况如何?

print testlist.index(element)

如果您不确定要查找的元素是否实际位于列表中,您可以添加初步检查,例如

if element in testlist:
    print testlist.index(element)

print(testlist.index(element) if element in testlist else None)

或“pythonic方式”,我不太喜欢,因为代码不太清晰,但有时效率更高,

try:
    print testlist.index(element)
except ValueError:
    pass

答案 2 :(得分:40)

使用枚举:

testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
    if item == 1:
        print position

答案 3 :(得分:10)

for i in xrange(len(testlist)):
  if testlist[i] == 1:
    print i

xrange而不是请求的范围(请参阅注释)。

答案 4 :(得分:4)

这是另一种方法:

try:
   id = testlist.index('1')
   print testlist[id]
except ValueError:
   print "Not Found"

答案 5 :(得分:3)

[x for x in range(len(testlist)) if testlist[x]==1]

答案 6 :(得分:1)

请尝试以下操作:

testlist = [1,2,3,5,3,1,2,1,6]    
position=0
for i in testlist:
   if i == 1:
      print(position)
   position=position+1

答案 7 :(得分:1)

如果你的列表足够大并且你只希望在稀疏数量的索引中找到值,那么考虑到这个代码可以执行得更快,因为你不必迭代每个值清单。

lookingFor = 1
i = 0
index = 0
try:
  while i < len(testlist):
    index = testlist.index(lookingFor,i)
    i = index + 1
    print index
except ValueError: #testlist.index() cannot find lookingFor
  pass

如果您希望找到很多值,您可能只需将“index”附加到列表中并在末尾打印列表以节省每次迭代的时间。

答案 8 :(得分:0)

仅是为了说明完整的示例以及带有input_list的{​​{1}}(示例:input_list [0]),您要在其中查找searies1(示例:input_list [ 1])并获得series2中的索引(如果存在于series1中。)

注意:如果条件简单,您的series2将使用lambda表达式

certain condition

输出:

input_list = [[1,2,3,4,5,6,7],[1,3,7]]
series1 = input_list[0]
series2 = input_list[1]
idx_list = list(map(lambda item: series1.index(item) if item in series1 else None, series2))
print(idx_list)

答案 9 :(得分:0)

为什么复杂化?

testlist = [1,2,3,5,3,1,2,1,6]
for position, item in enumerate(testlist):
    if item == 1:
        print position

答案 10 :(得分:0)

我认为使用来自Tkinter库的curselection()方法可能很有用:

from Tkinter import * 
listbox.curselection()

此方法适用于Tkinter列表框小部件,因此您需要构建其中一个而不是列表。

这将返回如下位置:

('0',)(虽然更高版本的Tkinter可能会返回一个int列表)

这是第一个位置,数字会根据项目位置而改变。

有关详细信息,请参阅此页面: http://effbot.org/tkinterbook/listbox.htm

问候。

答案 11 :(得分:-2)

testlist = [1,2,3,5,3,1,2,1,6]
for id, value in enumerate(testlist):
    if id == 1:
        print testlist[id]

我猜这正是你想要的。 ;-) 'id'将始终是列表中值的索引。