Поиск элемента в массиве python

Поиск элемента в массиве python

Сегодня я расскажу о таком типе данных, как списки, операциях над ними и методах, о генераторах списков и о применении списков.

Что такое списки?

Списки в Python — упорядоченные изменяемые коллекции объектов произвольных типов (почти как массив, но типы могут отличаться).

Чтобы использовать списки, их нужно создать. Создать список можно несколькими способами. Например, можно обработать любой итерируемый объект (например, строку) встроенной функцией list:

Список можно создать и при помощи литерала:

Как видно из примера, список может содержать любое количество любых объектов (в том числе и вложенные списки), или не содержать ничего.

И еще один способ создать список — это генераторы списков. Генератор списков — способ построить новый список, применяя выражение к каждому элементу последовательности. Генераторы списков очень похожи на цикл for.

Возможна и более сложная конструкция генератора списков:

Но в сложных случаях лучше пользоваться обычным циклом for для генерации списков.

Функции и методы списков

Создать создали, теперь нужно со списком что-то делать. Для списков доступны основные встроенные функции, а также методы списков.

Таблица "методы списков"

Метод Что делает
list.append(x) Добавляет элемент в конец списка
list.extend(L) Расширяет список list, добавляя в конец все элементы списка L
list.insert(i, x) Вставляет на i-ый элемент значение x
list.remove(x) Удаляет первый элемент в списке, имеющий значение x. ValueError, если такого элемента не существует
list.pop([i]) Удаляет i-ый элемент и возвращает его. Если индекс не указан, удаляется последний элемент
list.index(x, [start [, end]]) Возвращает положение первого элемента со значением x (при этом поиск ведется от start до end)
list.count(x) Возвращает количество элементов со значением x
list.sort([key=функция]) Сортирует список на основе функции
list.reverse() Разворачивает список
list.copy() Поверхностная копия списка
list.clear() Очищает список
Читайте также:  Intel hd graphics 4600 какие игры пойдут

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

И, напоследок, примеры работы со списками:

Изредка, для увеличения производительности, списки заменяют гораздо менее гибкими массивами (хотя в таких случаях обычно используют сторонние библиотеки, например NumPy).

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

10 ответов

33 Решение Brian R. Bondy [2009-03-03 04:51:00]

Лучшим способом, вероятно, является использование метода list.index.

Для объектов в списке вы можете сделать что-то вроде:

с любой специальной обработкой, в которой вы нуждаетесь.

Вы также можете использовать оператор for/in с перечислением (arr)

Пример поиска индекса элемента, имеющего значение > 100.

194 Matt Howell [2009-03-03 04:52:00]

112 Eduardo [2011-02-17 13:00:00]

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

17 ThomasH [2010-09-24 12:35:00]

Вот еще один способ использования списка (некоторые могут найти его спорным). Он очень подходит для простых тестов, например. сравнение атрибутов объектов (что мне нужно много):

Конечно, это предполагает существование (и, фактически, единственность) подходящего элемента в списке.

Предполагая, что вы хотите найти значение в массиве numpy, Я думаю, что-то вроде этого может работать:

7 David Z [2009-03-03 04:50:00]

Существует метод index , i = array.index(value) , но я не думаю, что вы можете указать пользовательский оператор сравнения. Нетрудно написать свою собственную функцию, чтобы сделать это:

5 jki [2011-10-20 15:30:00]

Я использую функцию для возврата индекса для соответствующего элемента (Python 2.6):

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

Читайте также:  Режим работы день через день

Если мне нужно использовать его в нескольких местах в моем коде, я просто определяю конкретную функцию поиска, например. для нахождения элемента по имени:

И тогда это довольно легко и доступно:

Индексный метод списка сделает это за вас. Если вы хотите гарантировать заказ, сначала соберите список, используя sorted() . Сортировка принимает параметр cmp или key, чтобы определить, как будет выполняться сортировка:

2 Gael [2011-10-16 14:41:00]

Я нашел это, адаптировав некоторые туто. Спасибо google и всем вам;)

Задача: из данного списка найти наибольшее число.

Этот код выдает ошибку set changed size during iterations.

3 Answers

Поясню что не так:

  1. Эта функция реализуется на одном цикле;
  2. У вас b стало равно c , а потом вы попытались убрать оттуда элемент прямо в цикле перебора элементов с . Вот на это вам интерпретатор и высказывает свое возмущение.

Как уже было указано в более раннем ответе, функция поиска максимума реализуется за один проход циклом. Соответственно, создание множества также не требуется. Попробуйте придумать такой способ вычисления и реализовать его. Он будет гораздо проще и понятней имеющегося.

А теперь про проблемы имеющегося кода:

При выполнении строки

вы не создали копию множества, а просто создали новую ссылку на это же множество. Чтобы скопировать множество, можно воспользоваться функцией set :

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

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

Поэтому, можно изменить условие так, чтобы учитывалось количество элементов в множестве, а не в исходном списке, переменная N в этом случае оказывается лишней:

Читайте также:  Obnovi soft что это

Алгоритм теперь формально работает, но всё ещё можно внести несколько улучшений в существующий код:

Можно заметить, что удаление элемента из множества b не требуется и можно просто удалить эту строку, не теряя в правильности алгоритма. Действительно, если при итерации нам попадётся текущий перебираемый элемент, то он не повлияет на сравнение и не изменит результат. А раз мы не изменяем множество c , то нет смысла и в его копировании. В итоге мы можем удалить и строку создания нового списка, изменив переменную, по которой итерируется внутренний цикл:

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

Заметим, что на пустом списке алгоритм не инициализирует переменную z и лучше присвоить ей какое-нибудь значение, чтобы пользователь не получил ошибку NameError при попытке прочитать найденное значение. Для этого достаточно добавить присваивание z = None в начале кода.

Вспомним, что в коде важны имена переменных и таки приведём их в надлежащий вид и вынесем решение в функцию, чтобы можно было переиспользовать код при желании. В случае использования функции от переменной z можно полностью избавиться, заменив её возвращаемым значением, плюс оператор break преобразуется в return :

Дальнейшие улучшения (не касающиеся изменения алгоритма поиска максимального элемента), которые я вижу, связаны с использованием стандартных функций и генераторных выражений. Так как это задание нужно реализовать без использования стандартных функций, то я остановлюсь на последнем варианте.

Ссылка на основную публикацию
Подключение коллекторного двигателя постоянного тока
Колле́кторный электродви́гатель — электрическая машина, в которой датчиком положения ротора и переключателем тока в обмотках является одно и то же...
Перенос почты с одного хостинга на другой
Перенос почты со стороннего хостинга вам необходимо выполнить самостоятельно. Помощь со стороны технической поддержки, к сожалению, не предоставляется. Для переноса...
Перенос информации с самсунга на самсунг
У компании Samsung есть хорошая разработка, которая носит название Smart Switch. Благодаря ей вы можете узнать, как перенести данные с...
Подключение компьютер к компьютеру через кабель
Количество владельцев двух и более домашних компьютеров (ноутбуков) постоянно увеличивается. У каждого такого человека периодически возникает необходимость переноса определенных файлов...
Adblock detector