Я сталкивался с этим:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
но иногда это не работает со всеми моими элементами, как будто они не были распознаны в списке (когда это список строк).
Является ли это наиболее «питоническим» способом поиска элемента в списке if x in l:
?
myList
.Ответы:
Что касается вашего первого вопроса: этот код прекрасно работает и должен работать, если
item
равен одному из элементов внутриmyList
. Возможно, вы пытаетесь найти строку, которая не совсем соответствует одному из элементов, или, возможно, вы используете значение с плавающей запятой, которое страдает от неточности.Что касается вашего второго вопроса: на самом деле есть несколько возможных способов «найти» вещи в списках.
Проверка, если что-то внутри
Это пример использования, который вы описываете: Проверка, находится ли что-то внутри списка или нет. Как вы знаете, вы можете использовать
in
оператор для этого:Фильтрация коллекции
То есть поиск всех элементов в последовательности, которые удовлетворяют определенному условию. Для этого вы можете использовать списки или выражения генератора:
Последний вернет генератор, который вы можете представить как некий ленивый список, который будет создан только после того, как вы выполните его итерацию. Кстати, первый точно соответствует
в Python 2. Здесь вы можете увидеть функции высшего порядка в работе. В Python 3
filter
возвращает не список, а объект, похожий на генератор.Нахождение первого вхождения
Если вам нужно только первое, что соответствует условию (но вы еще не знаете, что это такое), можно использовать цикл for (возможно, также с помощью
else
предложения, которое не очень хорошо известно). Вы также можете использоватькоторый вернет первое совпадение или поднимет a,
StopIteration
если ничего не найдено. Кроме того, вы можете использоватьНахождение местоположения предмета
Для списков есть также
index
метод, который иногда может быть полезен, если вы хотите знать, где находится определенный элемент в списке:Однако обратите внимание, что если у вас есть дубликаты,
.index
всегда возвращается самый низкий индекс: ......Если есть дубликаты и вам нужны все индексы, вы можете использовать
enumerate()
вместо:источник
if x in list
это не вещь , что люди жалуются , не будучи встроенной функцией. Они жалуются на то, что не существует явного способа найти первое появление чего-либо в списке, который соответствует определенному условию. Но, как указано в моем ответе,next()
(ab) может быть использовано для этого.[list comprehension...][0]
подходindex()
называется ,key
которая работала как иkey
принятоmax()
; например:index(list, key=is_prime)
.Если вы хотите найти один элемент или
None
использовать по умолчаниюnext
, он не будет вызываться,StopIteration
если элемент не найден в списке:источник
next
принимает итератор в качестве первого параметра, а список / кортеж НЕ является итератором. Так что следуетfirst_or_default = next(iter([x for x in lst if ...]), None)
посмотреть docs.python.org/3/library/functions.html#next(x for x in lst if ...)
это генератор над спискомlst
(который является итератором). Если вы это сделаетеnext(iter([x for x in lst if ...]), None)
, вы должны[x for x in lst if ...]
создать список , который будет гораздо более дорогой операцией.if
в лямбда- выражении, и вы можете писатьfind(fn,list)
вместо того, чтобы запутывать код генератора.Хотя ответ от Niklas B. довольно исчерпывающий, когда мы хотим найти элемент в списке, иногда бывает полезно получить его индекс:
источник
Нахождение первого вхождения
Есть рецепт для этого в
itertools
:Например, следующий код находит первое нечетное число в списке:
источник
Другой вариант: вы можете проверить, есть ли элемент в списке
if item in list:
, но это порядок O (n). Если вы имеете дело с большими списками элементов, и все, что вам нужно знать, это то, является ли что-то членом вашего списка, вы можете сначала преобразовать список в набор и воспользоваться преимуществом поиска набора с постоянным временем :Не будет правильным решением в каждом случае, но в некоторых случаях это может повысить производительность.
Обратите внимание, что создание набора с помощью
set(my_list)
также является O (n), поэтому, если вам нужно сделать это только один раз, то делать это не быстрее. Если вам необходимо повторно проверять членство, тогда это будет O (1) для каждого поиска после создания этого начального набора.источник
Вы можете использовать один из двух возможных поисков при работе со списком строк:
если элемент списка равен элементу («example» находится в [«one», «example», «two»]):
if item in your_list: some_function_on_true()
'ex' в ['one', 'ex', 'two'] => True
'ex_1' в ['one', 'ex', 'two'] => False
если элемент списка похож на элемент ('ex' находится в ['one,' example ',' two '] или' example_1 'находится в [' one ',' example ',' two ']):
matches = [el for el in your_list if item in el]
или
matches = [el for el in your_list if el in item]
затем просто проверьте
len(matches)
или прочитайте их, если это необходимо.источник
Определение и использование
count()
метод возвращает количество элементов с заданным значением.Синтаксис
пример:
Пример вопроса:
источник
Вместо использования
list.index(x)
которого возвращает индекс x, если он найден в списке, или возвращает#ValueError
сообщение, если x не найден, вы можете использоватьlist.count(x)
метод, который возвращает число вхождений x в список (проверка того, что x действительно находится в списке), или его в противном случае возвращает 0 (при отсутствии x). Самое интересное в том,count()
что он не нарушает ваш код и не требует от вас исключения, когда x не найденисточник
Если вы собираетесь проверить, существует ли значение в предмете коллекционирования один раз, тогда лучше использовать оператор «in». Однако, если вы собираетесь проверять более одного раза, я рекомендую использовать модуль bisect. Имейте в виду, что при использовании модуля bisect данные должны быть отсортированы. Таким образом, вы сортируете данные один раз, а затем можете использовать bisect. Использование модуля bisect на моей машине примерно в 12 раз быстрее, чем использование оператора «in».
Вот пример кода с использованием синтаксиса Python 3.8 и выше:
Вывод:
источник
Убедитесь, что в элементах списка строк нет дополнительных / нежелательных пробелов. Это причина, которая может мешать объяснению предметов не может быть найдено.
источник