Как сравнивать списки в Python

При программировании или изучении 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.

Tags:

Добавить комментарий