Как сравнить два списка в Python
В этой статье мы разберемся с различными способами сравнения двух списков в Python. Мы часто сталкиваемся с ситуациями, когда нам нужно сравнить значения элементов данных, хранящихся в любой структуре, например, в списке, кортеже, строке и т.д.
Сравнение – это метод проверки элементов данных одного списка на предмет равенства с элементами данных другого списка.
Методы сравнения двух списков
Мы можем использовать любой из следующих методов для сравнения:
- Функции reduce() и map().
- Функция collection.counter().
- sort() вместе с оператором ==.
- set() вместе с оператором ==.
- Функция difference().
1. Функции Python reduce() и map()
Мы можем использовать функцию map() вместе с функцией functools.reduce() для сравнения элементов данных двух списков.
Метод map() принимает в качестве аргументов функцию и итерацию, например список, кортеж, строку и т.д.
Он применяет переданную функцию к каждому элементу итерации, а затем возвращает объект карты, то есть итератор, в качестве результата.
Метод functools.reduce() применяет переданную функцию к каждому элементу итерируемого ввода рекурсивным образом.
Первоначально он применит функцию к первому и второму элементам и вернет результат. Тот же процесс будет продолжаться для каждого из элементов, пока в списке не останется элементов.
Как комбинация, функция map() применяет функцию ввода к каждому элементу, а функция reduce() гарантирует, что она применяет функцию последовательно.
2. Метод Python collection.counter()
Метод collection.counter() можно использовать для эффективного сравнения списков. Функция counter() подсчитывает частоту элементов в списке и сохраняет данные в виде словаря в формате <значение>: <частота>.
Если два списка имеют одинаковый вывод словаря, мы можем сделать вывод, что списки одинаковы.
Примечание. Порядок в списке не влияет на метод counter().
3. Метод Python sort() и оператор ==
Мы можем объединить метод sort() с оператором == для сравнения двух списков.
Метод sort() используется для сортировки входных списков с целью, что если два входных списка равны, то элементы будут находиться в одних и тех же позициях индекса.
Примечание. Порядок в списке не влияет на этот метод, потому что мы будем сортировать списки перед сравнением.
Кроме того, оператор == используется для сравнения списка элемент за элементом.
4. Метод Python set() и оператор ==
Метод set() манипулирует элементами данных итерации до отсортированного набора элементов данных, не принимая во внимание порядок элементов.
Кроме того, оператор == используется для поэлементного сравнения элементов данных списка.
5. Понимание пользовательского списка
Мы можем использовать List в Python для сравнения двух списков.
В приведенном выше коде мы устанавливаем элемент указателя «x» на список l1 и l3. Далее мы проверяем, присутствует ли элемент, на который указывает элемент-указатель, в списках.
How to compare two lists in python?
Now I want to compare these two lists. I guess split returns a list. We can do simple comparision in Java like dateArr[i] == sdateArr[i] , but how can we do it in Python?
![]()
6 Answers 6
You could always do just:
By casting a , b and c as a set, you remove duplicates and order doesn’t count. Comparing sets is also much faster and more efficient than comparing lists.
![]()
If you mean lists, try == :
If you want to compare strings (per your comment):
Given the code you provided in comments, I assume you want to do this:
The split -method of the string returns a list. A list in Python is very different from an array. == in this case does an element-wise comparison of the two lists and returns if all their elements are equal and the number and order of the elements is the same. Read the documentation.
Списки, кортежи и словари
Для работы с наборами данных Python предоставляет такие встроенные типы как списки, кортежи и словари.
Список (list) представляет тип данных, который хранит набор или последовательность элементов. Во многих языках программирования есть аналогичная структура данных, которая называется массив.
Создание списка
Для создания списка применяются квадратные скобки [] , внутри которых через запятую перечисляются элементы списка. Например, определим список чисел:
Подобным образом можно определять списки с данными других типов, например, определим список строк:
Также для создания списка можно использовать функцию-конструктор list() :
Оба этих определения списка аналогичны — они создают пустой список.
Список необязательно должен содержать только однотипные объекты. Мы можем поместить в один и тот же список одновременно строки, числа, объекты других типов данных:
Для проверки элементов списка можно использовать стандартную функцию print, которая выводит содержимое списка в удобочитаемом виде:
Конструктор list может принимать набор значений, на основе которых создается список:
Если необходимо создать список, в котором повторяется одно и то же значение несколько раз, то можно использовать символ звездочки *, то есть фактически применить операцию умножения к уже существующему списку:
Обращение к элементам списка
Для обращения к элементам списка надо использовать индексы, которые представляют номер элемента в списка. Индексы начинаются с нуля. То есть первый элемент будет иметь индекс 0, второй элемент — индекс 1 и так далее. Для обращения к элементам с конца можно использовать отрицательные индексы, начиная с -1. То есть у последнего элемента будет индекс -1, у предпоследнего — -2 и так далее.
Для изменения элемента списка достаточно присвоить ему новое значение:
Разложение списка
Python позволяет разложить список на отдельные элементы:
В данном случае переменным tom, bob и sam последовательно присваиваются элементы из списка people. Однако следует учитывать, что количество переменных должно быть равно числу элементов присваиваемого списка.
Перебор элементов
Для перебора элементов можно использовать как цикл for, так и цикл while.
Перебор с помощью цикла for :
Здесь будет производиться перебор списка people, и каждый его элемент будет помещаться в переменную person.
Перебор также можно сделать с помощью цикла while :
Для перебора с помощью функции len() получаем длину списка. С помощью счетчика i выводит по элементу, пока значение счетчика не станет равно длине списка.
Сравнение списков
Два списка считаются равными, если они содержат один и тот же набор элементов:
В данном случае оба списка будут равны.
Получение части списка
Если необходимо получить какую-то определенную часть списка, то мы можем применять специальный синтаксис, который может принимать следующие формы:
list[:end] : через параметр end передается индекс элемента, до которого нужно копировать список
list[start:end] : параметр start указывает на индекс элемента, начиная с которого надо скопировать элементы
list[start:end:step] : параметр step указывает на шаг, через который будут копироваться элементы из списка. По умолчанию этот параметр равен 1.
Можно использовать отрицательные индексы, тогда отсчет будет идти с конца, например, -1 — предпоследний, -2 — третий сконца и так далее.
Методы и функции по работе со списками
Для управления элементами списки имеют целый ряд методов. Некоторые из них:
append(item) : добавляет элемент item в конец списка
insert(index, item) : добавляет элемент item в список по индексу index
extend(items) : добавляет набор элементов items в конец списка
remove(item) : удаляет элемент item. Удаляется только первое вхождение элемента. Если элемент не найден, генерирует исключение ValueError
clear() : удаление всех элементов из списка
index(item) : возвращает индекс элемента item. Если элемент не найден, генерирует исключение ValueError
pop([index]) : удаляет и возвращает элемент по индексу index. Если индекс не передан, то просто удаляет последний элемент.
count(item) : возвращает количество вхождений элемента item в список
sort([key]) : сортирует элементы. По умолчанию сортирует по возрастанию. Но с помощью параметра key мы можем передать функцию сортировки.
reverse() : расставляет все элементы в списке в обратном порядке
copy() : копирует список
Кроме того, Python предоставляет ряд встроенных функций для работы со списками:
len(list) : возвращает длину списка
sorted(list, [key]) : возвращает отсортированный список
min(list) : возвращает наименьший элемент списка
max(list) : возвращает наибольший элемент списка
Добавление и удаление элементов
Для добавления элемента применяются методы append() , extend и insert , а для удаления — методы remove() , pop() и clear() .
Проверка наличия элемента
Если определенный элемент не найден, то методы remove и index генерируют исключение. Чтобы избежать подобной ситуации, перед операцией с элементом можно проверять его наличие с помощью ключевого слова in :
Выражение if «Alice» in people возвращает True, если элемент «Alice» имеется в списке people. Поэтому конструкция if «Alice» in people может выполнить последующий блок инструкций в зависимости от наличия элемента в списке.
Удаление с помощью del
Python также поддерживает еще один способ удаления элементов списка — с помощью оператора del . В качестве параметра этому оператору передается удаляемый элемент или набор элементов:
Подсчет вхождений
Если необходимо узнать, сколько раз в списке присутствует тот или иной элемент, то можно применить метод count() :
Сортировка
Для сортировки по возрастанию применяется метод sort() :
Если необходимо отсортировать данные в обратном порядке, то мы можем после сортировки применить метод reverse() :
При сортировке фактически сравниваются два объекта, и который из них «меньше», ставится перед тем, который «больше». Понятия «больше» и «меньше» довольно условны. И если для чисел все просто — числа расставляются в порядке возрастания, то для строк и других объектов ситуация сложнее. В частности, строки оцениваются по первым символам. Если первые символы равны, оцениваются вторые символы и так далее. При чем цифровой символ считается «меньше», чем алфавитный заглавный символ, а заглавный символ считается меньше, чем строчный.
Таким образом, если в списке сочетаются строки с верхним и нижним регистром, то мы можем получить не совсем корректные результаты, так как для нас строка «bob» должна стоять до строки «Tom». И чтобы изменить стандартное поведение сортировки, мы можем передать в метод sort() в качестве параметра функцию:
Кроме метода sort мы можем использовать встроенную функцию sorted , которая имеет две формы:
sorted(list) : сортирует список list
sorted(list, key) : сортирует список list, применяя к элементам функцию key
При использовании этой функции следует учитывать, что эта функция не изменяет сортируемый список, а все отсортированные элементы она помещает в новый список, который возвращается в качестве результата.
Минимальное и максимальное значения
Встроенный функции Python min() и max() позволяют найти минимальное и максимальное значения соответственно:
Копирование списков
При копировании списков следует учитывать, что списки представляют изменяемый (mutable) тип, поэтому если обе переменных будут указывать на один и тот же список, то изменение одной переменной, затронет и другую переменную:
Это так называемое «поверхностное копирование» (shallow copy). И, как правило, такое поведение нежелательное. И чтобы происходило копирование элементов, но при этом переменные указывали на разные списки, необходимо выполнить глубокое копирование (deep copy). Для этого можно использовать метод copy() :
Соединение списков
Для объединения списков применяется операция сложения (+):
Списки списков
Списки кроме стандартных данных типа строк, чисел, также могут содержать другие списки. Подобные списки можно ассоциировать с таблицами, где вложенные списки выполняют роль строк. Например:
Чтобы обратиться к элементу вложенного списка, необходимо использовать пару индексов: people[0][1] — обращение ко второму элементу первого вложенного списка.
Добавление, удаление и изменение общего списка, а также вложенных списков аналогично тому, как это делается с обычными (одномерными) списками:
Списки в Python
Списки Python — основная структура данных, широко используемая в программах Python. Они встречаются в других языках программирования, часто как динамические массивы. Списки — это изменяемый и последовательный тип данных, который позволяет индексацию и срезы. Список может содержать разные типы объектов, включая другие списки.
- [value1, value2, . ]
- list([iterable])
Замечания
Список это конкретный тип итераций, но не единственный в Python. Иногда лучше использовать множество, кортеж, или словарь.
Списком называют динамические массивы в Python (схоже с vector<void*> из C++ или Java ArrayList<Object> ). Это не связанный список.
Доступ к элементам осуществляется за константное время и очень быстро. Добавление элементов в конец списка происходит за амортизируемое постоянное время, но иногда включает выделение и копирование списка целиком. Списки включения связаны со списками.
Доступ к значениям списка
Списки Python имеют нулевую индексацию и действуют как массивы в других языках.
Попытка получить доступ к индексу за пределы списка возбудит IndexError .
Отрицательные показатели интерпретируются как отсчет от конца списка.
Это функционально эквивалентно
Списки позволяют использовать ломтик обозначение , как lst[start:end:step] .Выход среза обозначений представляет собой новый список , содержащий элементы из индекса start до end-1 .Если параметры опущены start значения по умолчанию для начала списка, end в конец списка и step 1:
Имея это в виду, вы можете распечатать обратную версию списка, вызвав
При использовании длин шагов с отрицательными значениями начальный индекс должен быть больше конечного индекса, в противном случае результатом будет пустой список.
Использование индексов отрицательных шагов эквивалентно следующему коду:
Используемые индексы на 1 меньше, чем используемые при отрицательной индексации, и обращены.
Продвинутый срез
Когда списки нарезали, то вызывается __getitem__() метод объекта списка со slice объектом. В Python есть встроенный метод среза для генерации объектов среза. Мы можем использовать это , чтобы сохранить кусочек и использовать его позже , как показано ниже,
Это может быть очень полезным, предоставляя функциональность для нарезки наших объектов путем переопределения __getitem__ в нашем классе.
Доступ к значениям во вложенном списке
Начиная с трехмерного списка:
Доступ к элементам в списке:
Выполнение вспомогательных операций:
Использование вложенных циклов for для печати списка:
Обратите внимание, что эта операция может использоваться для списка включения или даже в качестве генератора для повышения эффективности, например:
Не все элементы во внешних списках должны быть самими списками:
Еще один способ использовать вложенные циклы. Другой способ лучше, но мне нужно было использовать это иногда:
Использование фрагментов во вложенном списке:
Any() и All()
Вы можете использовать all() , чтобы определить , если все значения итератора вычисляют значение True
Аналогично, any() определяет , является ли одно или более значений в качестве итератора оценки True
Хотя в этом примере используется список, важно отметить, что эти встроенные модули работают с любыми итерациями, включая генераторы.
Проверка, если список пуст
Пустота списка связана с булевым значением False , так что вам не надо проверять len(lst) == 0 , а только lst или not lst
Проверка наличия элемента в списке
Python позволяет очень просто проверить, есть ли элемент в списке. Просто используйте in операторе.
Примечание: in оператора на множествах асимптотически быстрее , чем в списках. Если вам нужно использовать его много раз на потенциально большие списках, вы можете превратить ваш list в set , и проверить наличие элементов на set .
Сравнение списков
Можно сравнивать списки и другие последовательности лексикографически, используя операторы сравнения. Оба операнда должны быть одного типа.
Если один из списков содержится в начале другого, выигрывает самый короткий список.
Объединение и слияние списков
Самый простой способ конкатенации list1 и list2 :
zip возвращает список кортежей, где I-й кортеж содержит I-й элемент из каждого из аргументов последовательностей или итерируемыми:
Если списки имеют разную длину, результат будет включать в себя столько элементов, сколько самый короткий:
Для заполнения списков неравной длины до самого длинного с использованием None из itertools.zip_longest (не забудьте в python 3 импортировать библиотеку)
Вставка значений в определенный индекс:
Инициализация списка с фиксированным числом элементов
Для неизменяемых элементов (например , None , строковые литералы и т.д.):
Для изменяемых элементов, та же конструкция , приведет все элементы списка со ссылкой на тот же объект, например, для набора:
Вместо того , чтобы инициализировать список с фиксированным числом различных изменяемых объектов, используйте:
Перебор списка
Python поддерживает использование цикла for непосредственно для списка:
Вы также можете получить позицию каждого элемента одновременно:
Другой способ итерации списка на основе значения индекса:
Обратите внимание, что изменение элементов в списке во время итерации может привести к неожиданным результатам:
В этом последнем примере, мы удалили первый элемент в первой итерации, это стало причиной пропуска bar .
Длина списка
Используйте len() , чтобы получить одномерный длину списка.
len() также работает на строках, словарях и других структурах данных, подобных списку.
Обратите внимание, что len() является встроенной функцией, а не методом объекта списка.
Также обратите внимание , что стоимость len() является O(1) , то есть он будет тратить такое же количество времени, чтобы получить длину списка, независимо от его длины.
Список методов и поддерживаемых операторов
Начиная с данным списком a :
append(value) — добавляет новый элемент в конец списка.
Обратите внимание , что append() метод только добавляет один новый элемент в конец списка. Если вы добавляете список в другой список, добавляемый вами список становится единым элементом в конце первого списка.
extend(enumerable) — расширяет список путем добавления элементов из другого перечисляемого.
Списки также могут быть объединены с + оператора. Обратите внимание, что это не изменяет ни один из исходных списков:
insert(index, value) — вставляет value непосредственно перед указанным значение индекса index . Таким образом, после вставки нового элемента занимает позицию index .
remove(value) — удаляет первое вхождение заданного значения. Если прилагаемое значение не может быть найдено, то вызывается ValueError .
reverse() — изменяет список на месте и возвращает None .
Есть также другие способы реверсирования списка .
count(value) — подсчитывает количество вхождений некоторого значения в списке.
sort() — сортирует список в числовом и лексикографическом порядке и возвращает None .
Списки также могут быть отменены при сортировке с помощью reverse=True , флага в своем sort() методе.
Если вы хотите сортировать по атрибутам элементов, вы можете использовать key ключевого слова аргумента:
В случае списка словарей концепция одинакова:
Сортировать по субсловарям:
Лучший способ разобраться с помощью attrgetter и itemgetter
Списки также могут быть отсортированы с помощью функции attrgetter и itemgetter из модуля оператора. Это может помочь улучшить читаемость и возможность повторного использования. Вот несколько примеров,
itemgetter также может быть дан индекс. Это полезно, если вы хотите сортировать на основе индексов кортежа.
Используйте attrgetter , если вы хотите сортировать по атрибутам объекта:
clear() — удаляет все элементы из списка
Репликация — умножая существующий список на целое число будет производить больший список , состоящий из того, что многие копии оригинала. Это может быть полезно, например, для инициализации списка:
Будьте внимательны делая это , если список содержит ссылки на объекты (например , список списков).
Удаление элемента — можно удалить несколько элементов в списке , используя del ключевые слова и ломтик обозначение:
копирование
Назначение по умолчанию » language-python»>a = [1, 2, 3, 4, 5] b = a a.append(6) b >>>Out: [1, 2, 3, 4, 5, 6]
Если вы хотите создать копию списка, у вас есть варианты ниже.
Вы можете нарезать это:
Вы можете использовать встроенную функцию list() :
Вы можете использовать универсальный copy.copy() :
Это немного медленнее, чем list() , потому что он должен сначала выяснить тип данных old_list .
Если список содержит объекты, и вы также хотите скопировать их, используйте generic copy.deepcopy() :
Очевидно, самый медленный и самый требующий памяти метод, но иногда неизбежный.
copy() — возвращает неполную копию списка
Удалить повторяющиеся значения в списке
Удаление повторяющихся значений в списке может быть сделано путем преобразования списка в set (то есть неупорядоченный набор различных объектов). Если необходим список, то множество может быть преобразовано обратно в список с помощью функции list() :
Обратите внимание, что при преобразовании списка в набор исходный порядок теряется.
Для того, чтобы сохранить порядок списка можно использовать OrderedDict
Реверсирование элементов списка
Вы можете использовать функцию reversed , которая возвращает итератор обращенного списка:
Обратите внимание, что список «чисел» остается неизменным этой операцией и остается в том же порядке, в котором он был изначально.
Чтобы изменить на месте, вы можете также использовать в reverse метод .
Вы также можете изменить список (фактически получая копию, исходный список не затрагивается), используя синтаксис срезов, задав третий аргумент (шаг) как -1: