Вы возвращаете: [1] Самый низкий индекс, если есть несколько экземпляров "bar", [2] Все индексы "bar"?
Ṃųỻịgǻňạcểơửṩ
4
а) Гарантируется ли, что элемент находится в списке, или как мы должны обработать ошибку? (вернуть None / повысить ValueError) б) Гарантируется ли уникальность записей в списке, и должны ли мы возвращать первый индекс совпадения или все индексы?
smci
Просматривайте ответы с помощью numpy-интеграции, numy-массивы гораздо более эффективны, чем списки Python. Если список короткий, то нет проблем с его копированием из списка Python, если нет, то, возможно, вам стоит сначала сохранить элементы в массиве numpy.
Обратите внимание, что, хотя это, пожалуй, самый простой способ ответить на заданный вопрос , indexэто довольно слабый компонент listAPI, и я не могу вспомнить, когда в последний раз я использовал его в гневе. Мне было отмечено в комментариях, что, поскольку на этот ответ часто ссылаются, его следует сделать более полным. Некоторые предостережения о list.indexследовании. Вероятно, стоит сначала взглянуть на документацию:
list.index(x[, start[, end]])
Вернуть нулевой индекс в списке первого элемента, значение которого равно x . Поднимает, ValueErrorесли такого предмета нет.
Необязательные аргументы start и end интерпретируются так же, как в нотации слайса, и используются для ограничения поиска определенной подпоследовательностью списка. Возвращенный индекс вычисляется относительно начала полной последовательности, а не аргумента начала.
Линейная сложность по времени в длине списка
indexВызов проверяет каждый элемент списка в порядке, пока не найдет совпадения. Если ваш список длинный и вы не знаете, где именно он находится, этот поиск может стать узким местом. В этом случае вы должны рассмотреть другую структуру данных. Обратите внимание, что если вы точно знаете, где найти совпадение, вы можете дать indexподсказку. Например, в этом фрагменте l.index(999_999, 999_990, 1_000_000)примерно на пять порядков быстрее, чем прямой l.index(999_999), потому что первый должен искать только 10 записей, а второй ищет миллион:
Возвращает только индекс первого соответствия своему аргументу
Вызов indexвыполняет поиск по списку по порядку, пока не найдет совпадение и не остановится там. Если вы ожидаете, что вам понадобятся индексы большего числа совпадений, вы должны использовать понимание списка или выражение генератора.
>>>[1,1].index(1)0>>>[i for i, e in enumerate([1,2,1])if e ==1][0,2]>>> g =(i for i, e in enumerate([1,2,1])if e ==1)>>> next(g)0>>> next(g)2
В большинстве мест, где я когда-то пользовался index, теперь я использую списочное понимание или генераторное выражение, потому что они более обобщаемы. Так что, если вы хотите достичь index, взгляните на эти отличные возможности Python.
Выдает, если элемент отсутствует в списке
Вызов indexприводит к, ValueErrorесли элемент отсутствует.
>>>[1,1].index(2)Traceback(most recent call last):File"<stdin>", line 1,in<module>ValueError:2isnotin list
Если элемент может отсутствовать в списке, вы должны либо
Сначала проверьте это с помощью item in my_list(чистого, читабельного подхода) или
Оберните indexвызов в try/exceptблок, который перехватывает ValueError(возможно, быстрее, по крайней мере, когда список для поиска длинный, а элемент обычно присутствует).
index возвращает первый элемент, значение которого равно «bar». Если в списке дважды присутствует «бар», вы никогда не найдете ключ для второго «бара». См. Документацию: docs.python.org/3/tutorial/datastructures.html
mpoletto
2
Если вы ищете только один элемент (первый), я обнаружил, что index()он чуть менее чем на 90% быстрее, чем списки со списками целых чисел.
Слыблоты
Какую структуру данных следует использовать, если список очень длинный?
izhang05
@izhang: некоторый вспомогательный индекс, такой как диктант {element -> list_index}, если элементы являются хешируемыми, и позиция в списке имеет значение.
Алекс Ковентри
899
Одна вещь, которая действительно полезна при изучении Python - это использовать функцию интерактивной справки:
>>> help(["foo","bar","baz"])Help on list object:class list(object)...|| index(...)| L.index(value,[start,[stop]])-> integer --return first index of value|
который часто приведет вас к методу, который вы ищете.
bpython - это удобный и удобный способ читать документы в интерактивном режиме.
goetzc
@davidavr да, но у остальных из нас, кто просто хочет погуглить, вместо того, чтобы просматривать справочные документы, не было бы этого замечательного, центрального, ранжированного набора параметров. :)
хонкабой
557
Большинство ответов объясняют, как найти один индекс , но их методы не возвращают несколько индексов, если элемент находится в списке несколько раз. Используйте enumerate():
for i, j in enumerate(['foo','bar','baz']):if j =='bar':print(i)
index()Функция возвращает только первое вхождение, а enumerate()возвращает все вхождения.
Как понимание списка:
[i for i, j in enumerate(['foo','bar','baz'])if j =='bar']
Вот еще одно небольшое решение с itertools.count()(которое в значительной степени совпадает с подходом перечисления):
from itertools import izip as zip, count # izip for maximum efficiency[i for i, j in zip(count(),['foo','bar','baz'])if j =='bar']
Это более эффективно для больших списков, чем использование enumerate():
$ python -m timeit -s "from itertools import izip as zip, count""[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"10000 loops, best of 3:174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"10000 loops, best of 3:196 usec per loop
Для меня перечисление работает лучше, чем методы на основе индексов, так как я собираю индексы строк, используя 'setswith ", и мне нужно собрать несколько вхождений. Или есть ли способ использовать индекс с" setswith ", который я не мог понять
Тупело Тистлхед
3
В моих руках перечислимая версия последовательно немного быстрее. Некоторые подробности реализации могли измениться с момента публикации вышеуказанного измерения.
Проблема возникнет, если элемента нет в списке. Эта функция обрабатывает проблему:
# if element is found it returns index of element else returns Nonedef find_element_in_list(element, list_element):try:
index_element = list_element.index(element)return index_elementexceptValueError:returnNone
Однако это может удвоить сложность. Кто-нибудь проверял?
Stefanct
@stefanct Временная сложность все еще линейна, но она будет повторять список дважды.
Приближается к
@ApproachingDarknessFish Это, очевидно, то, что я имел в виду. Даже если педантично это тот же порядок сложности, повторение дважды может быть серьезным недостатком во многих случаях использования, поэтому я поднял его. И мы до сих пор не знаем ответа ...
Stefanct
44
Все предлагаемые здесь функции воспроизводят внутреннее поведение языка, но затеняют происходящее.
[i for i in range(len(mylist))if mylist[i]==myterm]# get the indices[each for each in mylist if each==myterm]# get the items
mylist.index(myterm)if myterm in mylist elseNone# get the first index and fail quietly
Зачем писать функцию с обработкой исключений, если язык предоставляет методы для того, что вы сами хотите?
Это лучший, который я прочитал. Числовые массивы намного эффективнее, чем списки Python. Если список короткий, то нет проблем с его копированием из списка Python, а если нет, то, возможно, разработчик должен в первую очередь подумать о сохранении элементов в массиве numpy.
Атанассиос
36
Нахождение индекса элемента по списку, содержащему его в Python
Для списка ["foo", "bar", "baz"]и элемента в списке "bar", каков самый чистый способ получить его индекс (1) в Python?
Ну, конечно, есть метод index, который возвращает индекс первого вхождения:
>>> l =["foo","bar","baz"]>>> l.index('bar')1
Есть несколько проблем с этим методом:
если значение отсутствует в списке, вы получите ValueError
если в списке более одного значения, вы получите индекс только для первого
Нет значений
Если значение может отсутствовать, вам нужно поймать ValueError.
Вы можете сделать это с помощью многоразового определения следующим образом:
И недостатком этого является то, что вы, вероятно, будете проверять, возвращаемое значение isили is notнет:
result = index(a_list, value)if result isnotNone:
do_something(result)
Более одного значения в списке
Если бы вы могли иметь больше случаев, вы не получите полную информацию с list.index:
>>> l.append('bar')>>> l
['foo','bar','baz','bar']>>> l.index('bar')# nothing at index 3?1
Вы можете перечислить в список, понимающий индексы:
>>>[index for index, v in enumerate(l)if v =='bar'][1,3]>>>[index for index, v in enumerate(l)if v =='boink'][]
Если у вас нет вхождений, вы можете проверить это с помощью логической проверки результата или просто ничего не делать, если вы просматриваете результаты:
indexes =[index for index, v in enumerate(l)if v =='boink']for index in indexes:
do_something(index)
Лучшее копание данных с пандами
Если у вас есть панды, вы можете легко получить эту информацию с помощью объекта Series:
>>>import pandas as pd
>>> series = pd.Series(l)>>> series
0 foo
1 bar
2 baz
3 bar
dtype: object
Проверка сравнения вернет серию логических значений:
>>> series =='bar'0False1True2False3True
dtype: bool
Передайте эту серию логических значений в серию через индексную запись, и вы получите только подходящие члены:
>>> series[series =='bar']1 bar
3 bar
dtype: object
Если вам нужны только индексы, атрибут index возвращает последовательность целых чисел:
И если вы хотите, чтобы они были в списке или кортеже, просто передайте их конструктору:
>>> list(series[series =='bar'].index)[1,3]
Да, вы могли бы использовать списочное понимание и с enumerate, но, на мой взгляд, это не так элегантно - вы делаете тесты на равенство в Python вместо того, чтобы позволить встроенному коду, написанному на C, обрабатывать его:
>>>[i for i, value in enumerate(l)if value =='bar'][1,3]
Проблема XY спрашивает о вашей попытке решения, а не о вашей реальной проблеме.
Как вы думаете, зачем нужен индекс, заданный элементом в списке?
Если вы уже знаете значение, почему вас волнует, где оно находится в списке?
Если значения нет, то выловление ValueErrorдовольно многословно - и я предпочитаю избегать этого.
В любом случае я обычно перебираю список, поэтому я обычно держу указатель на любую интересную информацию, получая индекс с перечислением.
Если вы манипулируете данными, вам, вероятно, следует использовать панд - в которых есть гораздо более элегантные инструменты, чем те чисто обходные пути Python, которые я показал.
Я не вспоминаю о необходимости list.index, сам. Тем не менее, я просмотрел стандартную библиотеку Python и нашел отличные варианты ее использования.
Есть много, много применений для этого idlelib, для графического интерфейса и синтаксического анализа текста.
В keywordмодуле использует его , чтобы найти комментарий маркера в модуле для автоматической регенерации списка ключевых слов в нем с помощью метапрограммирования.
В lib / mailbox.py кажется, что он используется как упорядоченное отображение:
key_list[key_list.index(old)]= new
а также
del key_list[key_list.index(key)]
В Lib / http / cookiejar.py, похоже, используется для получения следующего месяца:
mon = MONTHS_LOWER.index(mon.lower())+1
В lib / tarfile.py аналогично distutils для получения среза до элемента:
members = members[:members.index(tarinfo)]
В Lib / pickletools.py:
numtopop = before.index(markobject)
Похоже, что эти обычаи объединяют то, что они работают со списками ограниченных размеров (важно из-за времени поиска O (n) list.index), и они в основном используются при разборе (и пользовательском интерфейсе в случае ожидания).
Хотя для этого есть варианты использования, они довольно редки. Если вы ищете этот ответ, спросите себя, является ли то, что вы делаете, наиболее прямым использованием инструментов, предоставляемых языком для вашего варианта использования.
Получение всех вхождений и положения одного или нескольких (идентичных) элементов в списке
С помощью enumerate (alist) вы можете сохранить первый элемент (n), который является индексом списка, когда элемент x равен тому, что вы ищете.
>>> alist =['foo','spam','egg','foo']>>> foo_indexes =[n for n,x in enumerate(alist)if x=='foo']>>> foo_indexes
[0,3]>>>
Давайте сделаем нашу функцию findindex
Эта функция принимает элемент и список в качестве аргументов и возвращает позицию элемента в списке, как мы видели ранее.
def indexlist(item2find, list_or_string):"Returns all indexes of an item in a list or a string"return[n for n,item in enumerate(list_or_string)if item==item2find]print(indexlist("1","010101010"))
Вывод
[1,3,5,7]
просто
for n, i in enumerate([1,2,3,4,1]):if i ==1:print(n)
>>> a =['red','blue','green','red']>>> b ='red'>>> offset =0;>>> indices = list()>>>for i in range(a.count(b)):... indices.append(a.index(b,offset))... offset = indices[-1]+1...>>> indices
[0,3]>>>
... как подтверждение существования элемента до получения индекса. Приятной особенностью этого подхода является то, что функция всегда возвращает список индексов, даже если это пустой список. Он работает и со строками.
def indices(l, val):"""Always returns a list containing the indices of val in the_list"""
retval =[]
last =0while val in l[last:]:
i = l[last:].index(val)
retval.append(last + i)
last += i +1return retval
l =['bar','foo','bar','baz','bar','bar']
q ='bar'print indices(l,q)print indices(l,'bat')print indices('abcdaababb','a')
Когда вставлено в интерактивное окно Python:
Python2.7.6(v2.7.6:3a1db0d2747e,Nov102013,00:42:54)[GCC 4.2.1(AppleInc. build 5666)(dot 3)] on darwin
Type"help","copyright","credits"or"license"for more information.>>>def indices(the_list, val):..."""Always returns a list containing the indices of val in the_list"""... retval =[]... last =0...while val in the_list[last:]:... i = the_list[last:].index(val)... retval.append(last + i)... last += i +1...return retval
...>>> l =['bar','foo','bar','baz','bar','bar']>>> q ='bar'>>>print indices(l,q)[0,2,4,5]>>>print indices(l,'bat')[]>>>print indices('abcdaababb','a')[0,4,5,7]>>>
Обновить
После еще одного года бездумной разработки Python я немного смутился из-за своего первоначального ответа, так что для ясности можно использовать приведенный выше код; тем не менее, гораздо более идиоматический способ получить такое же поведение - использовать понимание списка вместе с функцией enumerate ().
Что-то вроде этого:
def indices(l, val):"""Always returns a list containing the indices of val in the_list"""return[index for index, value in enumerate(l)if value == val]
l =['bar','foo','bar','baz','bar','bar']
q ='bar'print indices(l,q)print indices(l,'bat')print indices('abcdaababb','a')
Который при вставке в интерактивное окно Python дает:
Python2.7.14|Anaconda,Inc.|(default,Dec72017,11:07:58)[GCC 4.2.1CompatibleClang4.0.1(tags/RELEASE_401/final)] on darwin
Type"help","copyright","credits"or"license"for more information.>>>def indices(l, val):..."""Always returns a list containing the indices of val in the_list"""...return[index for index, value in enumerate(l)if value == val]...>>> l =['bar','foo','bar','baz','bar','bar']>>> q ='bar'>>>print indices(l,q)[0,2,4,5]>>>print indices(l,'bat')[]>>>print indices('abcdaababb','a')[0,4,5,7]>>>
И теперь, после рассмотрения этого вопроса и всех ответов, я понимаю, что это именно то, что FMC предложил в своем предыдущем ответе . В то время, когда я первоначально отвечал на этот вопрос, я даже не видел этого ответа, потому что я не понимал его. Я надеюсь, что мой более подробный пример поможет понять.
Если приведенная выше строка кода по-прежнему не имеет смысла для вас, я настоятельно рекомендую вам «понимание списков Python» в Google и потратьте несколько минут на ознакомление. Это всего лишь одна из многих мощных функций, которые позволяют использовать Python для разработки кода.
Вариант ответа от FMc и user7177 даст указание, которое может вернуть все индексы для любой записи:
>>> a =['foo','bar','baz','bar','any','foo','much']>>> l = dict(zip(set(a), map(lambda y:[i for i,z in enumerate(a)if z is y ], set(a))))>>> l['foo'][0,5]>>> l ['much'][6]>>> l
{'baz':[2],'foo':[0,5],'bar':[1,3],'any':[4],'much':[6]}>>>
Вы также можете использовать это как один вкладыш, чтобы получить все индексы для одной записи. Гарантий эффективности нет, хотя я использовал set (a), чтобы уменьшить количество вызовов лямбды.
Это решение не такое мощное, как другие, но если вы новичок и знаете только о forциклах, все же возможно найти первый индекс элемента, избегая при этом ValueError:
def find_element(p,t):
i =0for e in p:if e == t:return i
else:
i +=1return-1
Это повторяет массив дважды, что может привести к проблемам с производительностью больших массивов.
Cristik
Согласен. Если списки очень длинные, я бы пошел на что-то еще. Не должно быть большой проблемой для небольших и средних списков.
Ketan
6
name ="bar"
list =[["foo",1],["bar",2],["baz",3]]
new_list=[]for item in list:
new_list.append(item[0])print(new_list)try:
location= new_list.index(name)except:
location=-1print(location)
Это учитывает, если строка не находится в списке тоже, если ее нет в списке, то location = -1
[i для i, j в перечислении (стоге сена), если j == 'needle'], я думаю, более компактно и читабельно.
Джованни Г.
5
index()Метод Python выдает ошибку, если элемент не был найден. Таким образом, вместо этого вы можете сделать его похожим на indexOf()функцию JavaScript, которая возвращает, -1если элемент не был найден:
try:
index = array.index('search_keyword')exceptValueError:
index =-1
тем не менее, JavaScript придерживается философии, согласно которой странные результаты лучше, чем ошибки, поэтому имеет смысл возвращать -1, но в Python может быть сложно отследить ошибку, поскольку -1 возвращает элемент из конца списка.
Этот ответ чувствует себя как дома для Scala/ функционально-программирование энтузиастов
Y2K-Shubham
3
Давайте дадим название lstсписку, который у вас есть. Можно преобразовать список lstв numpy array. А затем используйте numpy.where, чтобы получить индекс выбранного элемента в списке. Следующее - способ, которым вы будете это реализовывать.
import numpy as np
lst =["foo","bar","baz"]#lst: : 'list' data typeprint np.where( np.array(lst)=='bar')[0][0]>>>1
Если вы собираетесь найти индекс один раз, тогда лучше использовать метод «index». Однако, если вы собираетесь искать данные более одного раза, я рекомендую использовать модуль bisect . Имейте в виду, что при использовании модуля bisect данные должны быть отсортированы. Таким образом, вы сортируете данные один раз, а затем можете использовать bisect. Использование модуля bisect на моей машине примерно в 20 раз быстрее, чем с помощью метода index.
Вот пример кода с использованием синтаксиса Python 3.8 и выше:
import bisect
from timeit import timeit
def bisect_search(container, value):return(
index
if(index := bisect.bisect_left(container, value))< len(container)and container[index]== value else-1)
data = list(range(1000))# value to search
value =666# times to test
ttt =1000
t1 = timeit(lambda: data.index(value), number=ttt)
t2 = timeit(lambda: bisect_search(data, value), number=ttt)print(f"{t1=:.4f}, {t2=:.4f}, diffs {t1/t2=:.2f}")
В многочисленных ответах упоминается, что встроенный метод list.index(item)метода является алгоритмом O (n). Это хорошо, если вам нужно выполнить это один раз. Но если вам нужно получить доступ к индексам элементов несколько раз, имеет смысл сначала создать словарь (O (n)) пар элементов-индексов, а затем обращаться к индексу в O (1) каждый раз, когда вам нужно Это.
Если вы уверены, что элементы в вашем списке никогда не повторяются, вы можете легко:
myList =["foo","bar","baz"]# Create the dictionary
myDict = dict((e,i)for i,e in enumerate(myList))# Lookup
myDict["bar"]# Returns 1# myDict.get("blah") if you don't want an error to be raised if element not found.
Если у вас могут быть повторяющиеся элементы, и вам необходимо вернуть все их индексы:
from collections import defaultdict as dd
myList =["foo","bar","bar","baz","foo"]# Create the dictionary
myDict = dd(list)for i,e in enumerate(myList):
myDict[e].append(i)# Lookup
myDict["foo"]# Returns [0, 4]
на мой взгляд, ["foo", "bar", "baz"].index("bar")это хорошо, но этого не достаточно! потому что, если «bar» нет в словаре, то ValueErrorвозникает. Так что вы можете использовать эту функцию:
Не используйте это, потому l = [1, 2]; find_index(l, 3)что вернется -1и l[find_index(l, 3)]вернется 2. -1 плохо возвращать, просто вернуть нет.
Даниэль Стракабошко
-1 - это контракт, который вы можете вернуть, когда захотите, но старайтесь использовать меньшее значение None в своих программах, потому что None или Null при взаимодействии вашей программы с другими программами, такими как сайты Android и PHP, могут вызвать разрыв программы, например, вы можете вернуть null в JSON и приложение телефона вашего веб-сайта закроется или вернет ошибку 500 (внутренняя ошибка сервера).
"bar"
, [2] Все индексы"bar"
?Ответы:
Справка: Структуры данных> Подробнее о списках
Предостережения следуют
Обратите внимание, что, хотя это, пожалуй, самый простой способ ответить на заданный вопрос ,
index
это довольно слабый компонентlist
API, и я не могу вспомнить, когда в последний раз я использовал его в гневе. Мне было отмечено в комментариях, что, поскольку на этот ответ часто ссылаются, его следует сделать более полным. Некоторые предостережения оlist.index
следовании. Вероятно, стоит сначала взглянуть на документацию:Линейная сложность по времени в длине списка
index
Вызов проверяет каждый элемент списка в порядке, пока не найдет совпадения. Если ваш список длинный и вы не знаете, где именно он находится, этот поиск может стать узким местом. В этом случае вы должны рассмотреть другую структуру данных. Обратите внимание, что если вы точно знаете, где найти совпадение, вы можете датьindex
подсказку. Например, в этом фрагментеl.index(999_999, 999_990, 1_000_000)
примерно на пять порядков быстрее, чем прямойl.index(999_999)
, потому что первый должен искать только 10 записей, а второй ищет миллион:Возвращает только индекс первого соответствия своему аргументу
Вызов
index
выполняет поиск по списку по порядку, пока не найдет совпадение и не остановится там. Если вы ожидаете, что вам понадобятся индексы большего числа совпадений, вы должны использовать понимание списка или выражение генератора.В большинстве мест, где я когда-то пользовался
index
, теперь я использую списочное понимание или генераторное выражение, потому что они более обобщаемы. Так что, если вы хотите достичьindex
, взгляните на эти отличные возможности Python.Выдает, если элемент отсутствует в списке
Вызов
index
приводит к,ValueError
если элемент отсутствует.Если элемент может отсутствовать в списке, вы должны либо
item in my_list
(чистого, читабельного подхода) илиindex
вызов вtry/except
блок, который перехватываетValueError
(возможно, быстрее, по крайней мере, когда список для поиска длинный, а элемент обычно присутствует).источник
index()
он чуть менее чем на 90% быстрее, чем списки со списками целых чисел.Одна вещь, которая действительно полезна при изучении Python - это использовать функцию интерактивной справки:
который часто приведет вас к методу, который вы ищете.
источник
Большинство ответов объясняют, как найти один индекс , но их методы не возвращают несколько индексов, если элемент находится в списке несколько раз. Используйте
enumerate()
:index()
Функция возвращает только первое вхождение, аenumerate()
возвращает все вхождения.Как понимание списка:
Вот еще одно небольшое решение с
itertools.count()
(которое в значительной степени совпадает с подходом перечисления):Это более эффективно для больших списков, чем использование
enumerate()
:источник
Чтобы получить все индексы:
источник
index()
возвращает первый индекс значения!источник
Проблема возникнет, если элемента нет в списке. Эта функция обрабатывает проблему:
источник
источник
Вы должны установить условие, чтобы проверить, находится ли искомый элемент в списке
источник
Все предлагаемые здесь функции воспроизводят внутреннее поведение языка, но затеняют происходящее.
Зачем писать функцию с обработкой исключений, если язык предоставляет методы для того, что вы сами хотите?
источник
Если вы хотите все индексы, то вы можете использовать NumPy :
Это понятное, читаемое решение.
источник
Ну, конечно, есть метод index, который возвращает индекс первого вхождения:
Есть несколько проблем с этим методом:
ValueError
Нет значений
Если значение может отсутствовать, вам нужно поймать
ValueError
.Вы можете сделать это с помощью многоразового определения следующим образом:
И используйте это так:
И недостатком этого является то, что вы, вероятно, будете проверять, возвращаемое значение
is
илиis not
нет:Более одного значения в списке
Если бы вы могли иметь больше случаев, вы не получите полную информацию с
list.index
:Вы можете перечислить в список, понимающий индексы:
Если у вас нет вхождений, вы можете проверить это с помощью логической проверки результата или просто ничего не делать, если вы просматриваете результаты:
Лучшее копание данных с пандами
Если у вас есть панды, вы можете легко получить эту информацию с помощью объекта Series:
Проверка сравнения вернет серию логических значений:
Передайте эту серию логических значений в серию через индексную запись, и вы получите только подходящие члены:
Если вам нужны только индексы, атрибут index возвращает последовательность целых чисел:
И если вы хотите, чтобы они были в списке или кортеже, просто передайте их конструктору:
Да, вы могли бы использовать списочное понимание и с enumerate, но, на мой взгляд, это не так элегантно - вы делаете тесты на равенство в Python вместо того, чтобы позволить встроенному коду, написанному на C, обрабатывать его:
Это проблема XY ?
Как вы думаете, зачем нужен индекс, заданный элементом в списке?
Если вы уже знаете значение, почему вас волнует, где оно находится в списке?
Если значения нет, то выловление
ValueError
довольно многословно - и я предпочитаю избегать этого.В любом случае я обычно перебираю список, поэтому я обычно держу указатель на любую интересную информацию, получая индекс с перечислением.
Если вы манипулируете данными, вам, вероятно, следует использовать панд - в которых есть гораздо более элегантные инструменты, чем те чисто обходные пути Python, которые я показал.
Я не вспоминаю о необходимости
list.index
, сам. Тем не менее, я просмотрел стандартную библиотеку Python и нашел отличные варианты ее использования.Есть много, много применений для этого
idlelib
, для графического интерфейса и синтаксического анализа текста.В
keyword
модуле использует его , чтобы найти комментарий маркера в модуле для автоматической регенерации списка ключевых слов в нем с помощью метапрограммирования.В lib / mailbox.py кажется, что он используется как упорядоченное отображение:
а также
В Lib / http / cookiejar.py, похоже, используется для получения следующего месяца:
В lib / tarfile.py аналогично distutils для получения среза до элемента:
В Lib / pickletools.py:
Похоже, что эти обычаи объединяют то, что они работают со списками ограниченных размеров (важно из-за времени поиска O (n)
list.index
), и они в основном используются при разборе (и пользовательском интерфейсе в случае ожидания).Хотя для этого есть варианты использования, они довольно редки. Если вы ищете этот ответ, спросите себя, является ли то, что вы делаете, наиболее прямым использованием инструментов, предоставляемых языком для вашего варианта использования.
источник
Все индексы с
zip
функцией:источник
Получение всех вхождений и положения одного или нескольких (идентичных) элементов в списке
С помощью enumerate (alist) вы можете сохранить первый элемент (n), который является индексом списка, когда элемент x равен тому, что вы ищете.
Давайте сделаем нашу функцию findindex
Эта функция принимает элемент и список в качестве аргументов и возвращает позицию элемента в списке, как мы видели ранее.
Вывод
просто
Вывод:
источник
Просто вы можете пойти с
источник
Другой вариант
источник
А сейчас нечто соверешнно другое...
... как подтверждение существования элемента до получения индекса. Приятной особенностью этого подхода является то, что функция всегда возвращает список индексов, даже если это пустой список. Он работает и со строками.
Когда вставлено в интерактивное окно Python:
Обновить
После еще одного года бездумной разработки Python я немного смутился из-за своего первоначального ответа, так что для ясности можно использовать приведенный выше код; тем не менее, гораздо более идиоматический способ получить такое же поведение - использовать понимание списка вместе с функцией enumerate ().
Что-то вроде этого:
Который при вставке в интерактивное окно Python дает:
И теперь, после рассмотрения этого вопроса и всех ответов, я понимаю, что это именно то, что FMC предложил в своем предыдущем ответе . В то время, когда я первоначально отвечал на этот вопрос, я даже не видел этого ответа, потому что я не понимал его. Я надеюсь, что мой более подробный пример поможет понять.
Если приведенная выше строка кода по-прежнему не имеет смысла для вас, я настоятельно рекомендую вам «понимание списков Python» в Google и потратьте несколько минут на ознакомление. Это всего лишь одна из многих мощных функций, которые позволяют использовать Python для разработки кода.
источник
Вариант ответа от FMc и user7177 даст указание, которое может вернуть все индексы для любой записи:
Вы также можете использовать это как один вкладыш, чтобы получить все индексы для одной записи. Гарантий эффективности нет, хотя я использовал set (a), чтобы уменьшить количество вызовов лямбды.
источник
Это решение не такое мощное, как другие, но если вы новичок и знаете только о
for
циклах, все же возможно найти первый индекс элемента, избегая при этом ValueError:источник
Нахождение индекса элемента x в списке L:
источник
Это учитывает, если строка не находится в списке тоже, если ее нет в списке, то
location = -1
источник
Поскольку списки Python начинаются с нуля, мы можем использовать встроенную функцию zip следующим образом:
где «стог сена» - это рассматриваемый список, а «игла» - это элемент, который нужно искать.
(Примечание: здесь мы повторяем, используя i для получения индексов, но если нам нужно сосредоточиться на элементах, мы можем переключиться на j.)
источник
index()
Метод Python выдает ошибку, если элемент не был найден. Таким образом, вместо этого вы можете сделать его похожим наindexOf()
функцию JavaScript, которая возвращает,-1
если элемент не был найден:источник
Есть более функциональный ответ на это.
Более общая форма:
источник
Scala
/ функционально-программирование энтузиастовДавайте дадим название
lst
списку, который у вас есть. Можно преобразовать списокlst
вnumpy array
. А затем используйте numpy.where, чтобы получить индекс выбранного элемента в списке. Следующее - способ, которым вы будете это реализовывать.источник
Для тех, кто приходит с другого языка, как я, может быть, с простым циклом это легче понять и использовать:
Я благодарен за то, что именно перечисляет делать? , Это помогло мне понять.
источник
Если вы собираетесь найти индекс один раз, тогда лучше использовать метод «index». Однако, если вы собираетесь искать данные более одного раза, я рекомендую использовать модуль bisect . Имейте в виду, что при использовании модуля bisect данные должны быть отсортированы. Таким образом, вы сортируете данные один раз, а затем можете использовать bisect. Использование модуля bisect на моей машине примерно в 20 раз быстрее, чем с помощью метода index.
Вот пример кода с использованием синтаксиса Python 3.8 и выше:
Вывод:
источник
Если производительность вызывает беспокойство:
В многочисленных ответах упоминается, что встроенный метод
list.index(item)
метода является алгоритмом O (n). Это хорошо, если вам нужно выполнить это один раз. Но если вам нужно получить доступ к индексам элементов несколько раз, имеет смысл сначала создать словарь (O (n)) пар элементов-индексов, а затем обращаться к индексу в O (1) каждый раз, когда вам нужно Это.Если вы уверены, что элементы в вашем списке никогда не повторяются, вы можете легко:
Если у вас могут быть повторяющиеся элементы, и вам необходимо вернуть все их индексы:
источник
Как указывает @TerryA, многие ответы обсуждают, как найти один индекс.
more_itertools
сторонняя библиотека с инструментами для поиска нескольких индексов внутри итерируемогоДанный
Код
Найти индексы множественных наблюдений:
Протестируйте несколько предметов:
Смотрите также больше вариантов с
more_itertools.locate
. Установить через> pip install more_itertools
.источник
используя словарь, где сначала обработать список, а затем добавить к нему индекс
источник
на мой взгляд,
["foo", "bar", "baz"].index("bar")
это хорошо, но этого не достаточно! потому что, если «bar» нет в словаре, тоValueError
возникает. Так что вы можете использовать эту функцию:и результат:
и если name не было в arr, функция возвращает -1. Например:
источник
l = [1, 2]; find_index(l, 3)
что вернется-1
иl[find_index(l, 3)]
вернется2
. -1 плохо возвращать, просто вернуть нет.