Как получить позицию элемента в списке?

Я перебираю список и хочу распечатать индекс элемента, если он удовлетворяет определенному условию. Как бы я это сделал?

Пример:

testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
    if item == 1:
        print position
13.12.2008 01:20:32
11 ОТВЕТОВ
РЕШЕНИЕ

Хммм. Здесь был ответ с пониманием списка, но он исчез.

Вот:

 [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

И подумать я раньше писал Фортран.

275
15.09.2017 18:11:04
После 25 лет сомнений в функциональном программировании, я думаю, я наконец-то понял. понимание списка да бомба.
Charlie Martin 13.12.2008 18:30:04
Я предполагаю, что вы имеете в виду «одну букву», и, честно говоря, более длинное имя в этом примере не будет больше информационного содержания.
Charlie Martin 1.12.2010 19:28:26
Спасибо за отличный ответ. Я думаю, что комментарий @ nailer может касаться того факта, что вы используете 'i' в двух разных контекстах в одной строке в примере генератора; один внутри понимания, а другой перебирать его. Я знаю, это отбросило меня на секунду.
Brown 3.05.2013 14:34:10
@CharlieMartin Вы используете 'i' для индекса, а не элемент в соответствии с одним общим соглашением для односимвольных переменных. Именование индекса index и элемента item устранит неоднозначность. Кроме того, вы отвечаете родителю, который использовал «item» и «position», и это хороший способ не переименовывать части исходного кода в вашем ответе.
mikemaccana 3.05.2013 14:54:19
Супер синтаксис: o) Вы можете легко получить параметр командной строки. Пусть есть массив аргументов: args = ['x', '-p1', 'v1', '-p2', 'v2']. Затем команда args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1]возвращается'v1'
Tomáš K. 15.08.2014 11:20:43
for i in xrange(len(testlist)):
  if testlist[i] == 1:
    print i

xrange вместо диапазона, как требуется (см. комментарии).

10
13.12.2008 01:48:40
replace range () на xrange () - range () создает список, xrange () создает итератор. xrange () использует меньше памяти, а исходный вызов быстрее.
gnud 13.12.2008 01:39:38
Я согласен на большие списки в программах Python 2. Обратите внимание, что 'range' все еще будет работать в Python 3 (и работать как xrange IIRC). «xrange» идет по пути динозавров.
jakber 13.12.2008 01:44:41
Обновление: xrangeразвращено в Python 3.x, поскольку новое range- староеxrange
tim-oh 13.03.2017 12:51:07

Используйте перечислять:

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

Если ваш список стал достаточно большим, и вы ожидали найти значение только в небольшом числе индексов, учтите, что этот код может выполняться намного быстрее, поскольку вам не нужно повторять каждое значение в списке.

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

Если вы ожидаете много найти значение, вам, вероятно, следует просто добавить «индекс» в список и распечатать список в конце, чтобы сэкономить время на итерацию.

1
13.12.2008 03:14:50
Я сделал несколько тестов времени. Техника понимания списка работает на 38% быстрее, чем этот код. (Я заменил ваше заявление на печать вызовом outputlist.append)
Deestan 13.12.2008 16:31:43
Я также провел несколько тестов с размерами списка 100000 случайных значений от 1 до 100. Код, который я написал, в некоторых случаях был в два раза быстрее. Ни одно временное тестирование не сравнимо с заявлением автора (конечно, они должны проверить себя). Я прошу прощения, если мое мнение было вредным для этого поста.
user44484 13.12.2008 17:05:57
testlist = [1,2,3,5,3,1,2,1,6]
for id, value in enumerate(testlist):
    if id == 1:
        print testlist[id]

Я думаю, что это именно то, что вы хотите. ;-) 'id' всегда будет индексом значений в списке.

-2
11.04.2011 17:28:14

Вот еще один способ сделать это:

try:
   id = testlist.index('1')
   print testlist[id]
except ValueError:
   print "Not Found"
5
29.06.2018 13:16:19

Как насчет следующего?

print testlist.index(element)

Если вы не уверены, действительно ли искомый элемент находится в списке, вы можете добавить предварительную проверку, например:

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

или

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

или «питонический путь», который мне не очень нравится, потому что код менее понятен, но иногда более эффективен,

try:
    print testlist.index(element)
except ValueError:
    pass
165
26.02.2017 23:59:50
вместо того, чтобы проверять перед доступом, вы также можете просто попробоватьValueError
kratenko 18.08.2013 20:45:26
Я думаю, что он хочет найти все вхождения, вы, кажется, даете только первое.
tfv 5.10.2017 08:32:35
@ tfv Я не понимаю, как вы можете прийти к такому выводу, поскольку в вопросе говорится «пункт», а не «элементы».
mmj 8.10.2017 21:53:59
[x for x in range(len(testlist)) if testlist[x]==1]
3
4.10.2012 16:41:33

Я думаю, что было бы полезно использовать метод curselection () из библиотеки Tkinter:

from Tkinter import * 
listbox.curselection()

Этот метод работает с виджетами списка Tkinter, поэтому вам нужно создать один из них вместо списка.

Это вернет позицию как это:

('0',) (хотя более поздние версии Tkinter могут вместо этого возвращать список целых)

Который для первой позиции и номер будет меняться в зависимости от позиции элемента.

Для получения дополнительной информации см. Эту страницу: http://effbot.org/tkinterbook/listbox.htm

Приветствую.

0
20.06.2013 23:22:04
Интересная идея. Поскольку для этого требуется импортировать всю библиотеку Tkinter, это не самый эффективный способ решения проблемы.
seaotternerd 20.06.2013 22:47:33
Это такой неэффективный и извилистый путь, что я бы сказал, что это неправильный ответ, даже если он несколько решает вопрос.
user559633 9.11.2013 20:48:07
Этот ответ не имеет ничего общего с вопросом.
Cody Piersall 22.08.2014 13:42:04

Зачем усложнять вещи?

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

Попробуйте ниже:

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