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

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

Пример:

testlist = [1,2,3,5,3,1,2,1,6]
for item in testlist:
    if item == 1:
        print position
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
177
0
564 784
12
Перейти к ответу Данный вопрос помечен как решенный

Ответы 12

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

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

заменить range () на xrange () - range () создает список, xrange () создает итератор. xrange () использует меньше памяти, а первоначальный вызов выполняется быстрее.

gnud 13.12.2008 04:39

Я согласен на большие списки в программах на Python 2. Обратите внимание, что «диапазон» по-прежнему будет работать в python 3 (и работать как xrange IIRC). xrange идет по пути динозавров.

jakber 13.12.2008 04:44

Обновление: xrange изменен в Python 3.x, так как новый range - это старый xrange

tim-oh 13.03.2017 15:51

Используйте enumerate:

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

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

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» к списку и распечатать список в конце, чтобы сэкономить время на итерацию.

Я сделал несколько тестов на время. Техника понимания списка работает на 38% быстрее, чем этот код. (Я заменил ваш оператор печати вызовом outputlist.append)

Deestan 13.12.2008 19:31

Я также провел несколько тестов с размером списка из 100000 случайных значений от 1 до 100. Написанный мной код был в некоторых случаях в два раза быстрее. Никакое временное тестирование не сравнимо с приложением плаката (разумеется, они должны сами себя тестировать). Прошу прощения, если мое мнение нанесло ущерб этому посту.

user44484 13.12.2008 20:05
Ответ принят как подходящий

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

Здесь:

 [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

Подумать только, я писал ФОРТРАН.

Это лучший ответ, ИМО. Он ясен и лаконичен, и вы фактически фиксируете значения индекса, поэтому он расширяемый (вы можете распечатать их, передать их другой функции и т. д.). Единственное улучшение - использовать выражение генератора для случаев с большим количеством совпадений. is.gd/brzl

gotgenes 13.12.2008 06:53

После, наверное, 25 лет сомнений в функциональном программировании, я думаю, что наконец понял. понимание списка просто бомба.

Charlie Martin 13.12.2008 21:30

Переменные, состоящие из одного слова, затрудняют понимание вашего кода, особенно в примерах программирования.

mikemaccana 28.01.2010 14:16

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

Charlie Martin 01.12.2010 22:28

Спасибо за отличный ответ. Я думаю, что комментарий @nailer может относиться к тому факту, что вы используете «i» в двух разных контекстах в одной строке в примере генератора; один внутри понимания, а другой - для его перебора. Я знаю, это на секунду сбило меня с толку.

Brown 03.05.2013 18:34

@CharlieMartin Вы используете 'i' для индекса, а не для элемента в соответствии с одним общим соглашением для односимвольных переменных. Присвоение имени индексу index и элемента item устранит двусмысленность. Кроме того, вы отвечаете родителю, который использовал «элемент» и «положение», и это хороший способ не переименовывать без необходимости части исходного кода в своем ответе.

mikemaccana 03.05.2013 18:54

Хм. В каждом случае i за пределами понимания списка или генератора - это именно то, что собрано как i внутри. Было бы странно иметь для него два разных названия.

Charlie Martin 04.05.2013 19:32

Супер-синтаксис: o) Вы можете легко получить параметр командной строки. Пусть есть массив аргументов: args = ['x', '-p1', 'v1', '-p2', 'v2']. Затем команда args[[i for i, x in enumerate(args) if x == '-p1'][0] + 1] возвращает 'v1'

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

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

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

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

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

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

вместо тестирования перед доступом вы также можете просто попробовать и проверить наличие ValueError

kratenko 19.08.2013 00:45

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

tfv 05.10.2017 11:32

@tfv Я не понимаю, как вы можете прийти к такому выводу, ведь в вопросе написано «item», а не «items».

mmj 09.10.2017 00:53
[x for x in range(len(testlist)) if testlist[x]==1]

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

from Tkinter import * 
listbox.curselection()

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

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

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

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

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

Привет.

Интересная идея. Однако, поскольку для этого требуется импортировать всю библиотеку Tkinter, это не самый эффективный способ решения проблемы.

seaotternerd 21.06.2013 02:47

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

user559633 10.11.2013 00:48

Этот ответ не имеет ничего общего с вопросом.

Cody Piersall 22.08.2014 17:42

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

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

Попробуйте следующее:

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

Просто чтобы проиллюстрировать полный пример вместе с input_list, у которого есть searies1 (пример: input_list [0]), в котором вы хотите выполнить поиск series2 (пример: input_list [1]) и получить индексы series2, если он существует в series1.

Примечание: ваш 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)

выход:

[0, 2, 6]

Другие вопросы по теме