При программировании или изучении Python вам может понадобиться определить, равны ли два или несколько списков. При сравнении списков вы проверяете, одинаковой ли длины списки и соответствуют ли их элементы. Списки разной длины никогда не бывают равными.
В этом мануале мы разберем, как применять следующие функции Python для сравнения списков:
- Метод sort() или функция sorted() с оператором ==
- Функция set() с оператором ==
- Функции reduce() и map() с оператором ==
- Класс collection.Counter() с оператором ==
- Генератор списков
Метод sort() и функция sorted()
Сравнить списки можно с помощью метода sort() или функции sorted(). Метод sort() сортирует старый список, а функция sorted() возвращает новый. После сортировки равные списки будут иметь одинаковые элементы в одинаковых индексных позициях. Оператор == сравнивает списки поэлементно.
Порядок элементов исходного списка не важен, поскольку списки сортируются перед сравнением.
Примечание: Можно сортировать только списки, в которых элементы имеют одинаковый тип данных.
Пример sort()
В следующем примере показано, как с помощью метода sort() сортировать и сравнивать списки:
l1 = [10, 20, 30, 40, 50] l2 = [20, 30, 50, 40, 70] l3 = [50, 10, 30, 20, 40] l1.sort() l2.sort() l3.sort() if l1 == l2: print ("The lists l1 and l2 are the same") else: print ("The lists l1 and l2 are not the same") if l1 == l3: print ("The lists l1 and l3 are the same") else: print ("The lists l1 and l3 are not the same")
Получим следующий вывод:
The lists l1 and l3 are the same The lists l1 and l2 are not the same
Код предыдущего примера сортирует каждый список, сравнивает l1 с l3 и выводит результат, а затем сравнивает l1 с l2 и выводит результат.
Пример функции sorted()
В следующем примере показано, как с помощью функции sorted() сортировать и сравнить списки:
l1 = [10, 20, 30, 40, 50] l2 = [20, 30, 50, 40, 70] l3 = [50, 10, 30, 20, 40] l1_sorted = sorted(l1) l2_sorted = sorted(l2) l3_sorted = sorted(l3) if l1_sorted == l2_sorted: print ("The lists l1 and l2 are the same") else: print ("The lists l1 and l2 are not the same") if l1_sorted == l3_sorted: print ("The lists l1 and l3 are the same") else: print ("The lists l1 and l3 are not the same")
Вывод будет следующим:
The lists l1 and l3 are the same The lists l1 and l2 are not the same
Код предыдущего примера возвращает отсортированную версию каждого списка, сравнивает l1 с l3 и выводит результат, а затем сравнивает l1 с l2 и выводит результат.
Сравнение списков с помощью функций reduce() и map()
Сравнить элементы двух списков можно с помощью функции map() вместе с функцией functools.reduce(). При их комбинации map() применяет заданную функцию к каждому элементу, а функция reduce() обеспечивает последовательное применение функции.
Функция map() принимает в качестве аргументов функцию и итератор. Затем map() применяет заданную функцию к каждому элементу итерации,а затем возвращает объект map (итератор) в качестве результата.
functools.reduce() в качестве аргументов также принимает функцию и итерируемый объект. Она рекурсивно применяет заданную функцию к каждому элементу итерации. Сначала functools.reduce() применяет функцию к первому и второму элементам и возвращает результат, а затем применяет ее к результату и третьему элементу и так продолжается до тех пор, пока в списке не останется ни одного элемента.
При их комбинации map() применит заданную функцию к каждому элементу, а reduce() обеспечит последовательное применение функции.
Порядок элементов списка важен для reduce() и map(). Списки с одинаковыми элементами в разном порядке не считаются одинаковыми. При необходимости списки можно сначала отсортировать.
В следующем примере показано, как проверить списки на равенство с помощью функций reduce() и map():
import functools l1 = [10, 20, 30, 40, 50] l2 = [20, 30, 50, 40, 70] l3 = [10, 20, 30, 40, 50] if functools.reduce(lambda x, y : x and y, map(lambda p, q: p == q,l1,l2), True): print ("The lists l1 and l2 are the same") else: print ("The lists l1 and l2 are not the same") if functools.reduce(lambda x, y : x and y, map(lambda p, q: p == q,l1,l3), True): print ("The lists l1 and l3 are the same") else: print ("The lists l1 and l3 are not the same")
Получим следующий вывод:
The lists l1 and l2 are not the same The lists l1 and l3 are the same
В предыдущем примере код сравнивает l1 с l2, а затем сравнивает l1 с l3.
Сравнение списков с помощью функции set()
С помощью функции set() можно создать объекты set на основе заданных списков, а затем проверить эти наборы на равенство с помощью оператора ==.
Порядок элементов исходного списка не важен, поскольку оператор == возвращает true, если каждый набор содержит одинаковые элементы в любом порядке.
Примечание. Дублирующиеся элементы списка появляются в наборе только один раз.
Следующий пример демонстрирует, как создавать наборы из списков и сравнивать их:
l1 = [10, 20, 30, 40, 50] l2 = [50, 10, 30, 20, 40] a = set(l1) b = set(l2) if a == b: print("Lists l1 and l2 are equal") else: print("Lists l1 and l2 are not equal")
Получаем вывод:
Lists l1 and l2 are equal
Код в предыдущем примере создает наборы a и b из списков l1 и l2, затем сравнивает их и выводит результат.
Сравнение списков с помощью класса collections.Counter()
С помощью класса collections.Counter() можно сравнивать списки. Функция counter() подсчитывает частоту элементов в списке и сохраняет данные в виде словаря в формате value:frequency. Если два списка выдают два одинаковых словаря, можно сделать вывод, что списки одинаковы.
Порядок элементов исходного списка не важен при сравнении с помощью класса Counter.
Следующий пример демонстрирует, как создать объекты Counter из заданных списков и сравнить их:
import collections l1 = [10, 20, 30, 40, 50] l2 = [20, 30, 50, 40, 70] l3 = [50, 20, 30, 40, 10] if collections.Counter(l1) == collections.Counter(l2): print ("The lists l1 and l2 are the same") else: print ("The lists l1 and l2 are not the same") if collections.Counter(l1) == collections.Counter(l3): print ("The lists l1 and l3 are the same") else: print ("The lists l1 and l3 are not the same")
Вывод будет следующим:
The lists l1 and l2 are not the same The lists l1 and l3 are the same
Код в предыдущем примере создаст объекты Counter для списков l1 и l2, сравнит их и выведет результат. Код повторяется для списков l1 и l3.
Сравнение с помощью генератора списков
Читайте также: Генераторы списков в Python 3
При сравнении списков с помощью генераторов порядок элементов исходного списка не важен.
Следующий пример показывает, как сравнить списки с помощью генератора:
l1 = [10, 20, 30, 40, 50] l2 = [50, 75, 30, 20, 40] l3 = [50, 20, 30, 40, 10] res = [x for x in l1 + l2 if x not in l1 or x not in l2] print(res) if not res: print("Lists l1 and l2 are equal") else: print("Lists l1 and l2 are not equal") res2 = [x for x in l1 + l3 if x not in l1 or x not in l3] print(res2) if not res2: print("Lists l1 and l3 are equal") else: print("Lists l1 and l3 are not equal")
Код в предыдущем примере устанавливает элемент-указатель x в списки l1 и l2, а затем проверяет, присутствует ли в списках элемент, на который указывает элемент-указатель. Если результат res — пустой список, то можно сделать вывод, что списки равны, поскольку нет элементов, которые присутствуют только в одном из списков.
Вывод будет следующим:
[10, 75] Lists l1 and l2 are not equal
Подводим итоги
В этом мануале мы разобрали несколько разных способов проверки списков на равенство в Python.