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

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

我正在遍历列表,如果满足特定条件,我想打印出该项目的索引。我该怎么做?

例:

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

I am iterating over a list and I want to print out the index of the item if it meets a certain condition. How would I do this?

Example:

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

回答 0

嗯 这里有一个关于列表理解的答案,但是它消失了。

这里:

 [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。

Hmmm. There was an answer with a list comprehension here, but it’s disappeared.

Here:

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

Example:

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

Update:

Okay, you want a generator expression, we’ll have a generator expression. Here’s the list comprehension again, in a for loop:

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

Now we’ll construct a generator…

>>> (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

and niftily enough, we can assign that to a variable, and use it from there…

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

And to think I used to write FORTRAN.


回答 1

接下来呢?

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

What about the following?

print testlist.index(element)

If you are not sure whether the element to look for is actually in the list, you can add a preliminary check, like

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

or

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

or the “pythonic way”, which I don’t like so much because code is less clear, but sometimes is more efficient,

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

回答 2

使用枚举:

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

Use enumerate:

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

回答 3

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

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

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

xrange instead of range as requested (see comments).


回答 4

这是执行此操作的另一种方法:

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

Here is another way to do this:

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

回答 5

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

回答 6

请尝试以下方法:

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

Try the below:

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

如果列表足够大,并且只希望在稀疏索引中找到该值,则可以认为该代码可以更快执行,因为您不必迭代列表中的每个值。

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

如果您希望找到很多值,则应该将“索引”附加到列表中,并在最后打印列表以节省每次迭代的时间。

If your list got large enough and you only expected to find the value in a sparse number of indices, consider that this code could execute much faster because you don’t have to iterate every value in the list.

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

If you expect to find the value a lot you should probably just append “index” to a list and print the list at the end to save time per iteration.


回答 8

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

from Tkinter import * 
listbox.curselection()

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

这将返回如下位置:

(“ 0”,)(尽管Tkinter的更高版本可能会返回一个int列表)

这是第一个位置,编号将根据项目位置而变化。

有关更多信息,请参见以下页面:http : //effbot.org/tkinterbook/listbox.htm

问候。

I think that it might be useful to use the curselection() method from thte Tkinter library:

from Tkinter import * 
listbox.curselection()

This method works on Tkinter listbox widgets, so you’ll need to construct one of them instead of a list.

This will return a position like this:

(‘0’,) (although later versions of Tkinter may return a list of ints instead)

Which is for the first position and the number will change according to the item position.

For more information, see this page: http://effbot.org/tkinterbook/listbox.htm

Greetings.


回答 9

为什么使事情复杂化?

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

Why complicate things?

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

回答 10

只是为了说明完整的示例,以及input_list其中具有searies1(example:input_list [0])的示例,您要在其中查找series2(example:input_list [1])并获取series2的索引(如果它在series1中存在)。

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

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)

输出:

[0, 2, 6]

Just to illustrate complete example along with the input_list which has searies1 (example: input_list[0]) in which you want to do a lookup of series2 (example: input_list[1]) and get indexes of series2 if it exists in series1.

Note: Your certain condition will go in lambda expression if conditions are simple

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)

output:

[0, 2, 6]

回答 11

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

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

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

I guess that it’s exacly what you want. ;-) ‘id’ will be always the index of the values on the list.