Как сравнивать списки в 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.
Сравнение с помощью генератора списков
При сравнении списков с помощью генераторов порядок элементов исходного списка не важен.
Следующий пример показывает, как сравнить списки с помощью генератора:
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.
Как сравнить два списка с частичным совпадением элементов?
Добрый день как можно сравнить два списка с частичным совпадением по элементам?
пытаюсь сделать так
files = ['новая папка', 'games', 'install', 'фото', 'музыка'] search = ['папка', 'фотки', 'музло'] result=list(set(search) & set(files)) print(result)
результат будет если в обеих списках будут одинаковые элементы
ожидаемый результат по частичному совпадению элементов между files и search:
[‘новая папка’, ‘фото’, ‘музыка’]
- Вопрос задан более года назад
- 392 просмотра
Комментировать
Решения вопроса 2
будет криво и не совсем корректно, но простого решения тут нет, надо брать и искать по семантическое сравнение
import re files = ['новая папка', 'games', 'install', 'фото', 'музыка'] search = ['папка', 'фотки', 'музло'] finds = set() chars_find = re.compile(r'\w') for file in files: for world_search in search: for world in chars_find.findall(world_search): if world in file: finds.add(file) print(finds)
Ответ написан более года назад
Комментировать
Нравится 1 Комментировать

Владимир Куц @fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Нечеткий поиск:
from fuzzywuzzy import fuzz files = ['новая папка', 'games', 'install', 'фото', 'музыка'] search = ['папка', 'фотки', 'музло'] result = [] for im in search: for fil in files: if fuzz.partial_ratio(im, fil) > 50: result.append(fil) print(result) # ['новая папка', 'фото', 'музыка']
Как сравнить два списка в Python
Python предоставляет несколько способов сравнения двух списков. Сравнение – это процесс, когда элементы данных сравниваются с другим элементом данных списка, независимо от того, совпадают они или нет.
list1 - [11, 12, 13, 14, 15] list2 - [11, 12, 13, 14, 15] Output - The lists are equal
Ниже приведены методы сравнения двух списков в Python.
Функция cmp()
Функция Python cmp() сравнивает два объекта Python и возвращает целочисленные значения -1, 0, 1 согласно сравнению.
Примечание. Не используется в версии Python 3.x.
Set() функция и оператор ==
Функция Python set() преобразовывает список в набор, не заботясь о порядке элементов. Кроме того, мы используем оператор равенства (==) для сравнения элементов данных в списке. Разберем на следующем примере.
list1 = [11, 12, 13, 14, 15] list2 = [12, 13, 11, 15, 14] a = set(list1) b = set(list2) if a == b: print("The list1 and list2 are equal") else: print("The list1 and list2 are not equal")
The list1 and list2 are equal
В приведенном выше примере мы объявили два списка для сравнения друг с другом. Мы преобразовали эти списки в набор и сравнили каждый элемент с помощью оператора ==. Все элементы равны в обоих списках, тогда, если блок выполнен, распечатывается результат.
Метод sort() с оператором ==
Функция Python sort() используется для сортировки списков. Элементы одного и того же списка имеют одинаковую позицию индекса, это означает, что списки равны.
Примечание. В методе sort() мы можем передавать элементы списка в любом порядке, потому что мы сортируем список перед сравнением.
Разберем метод в следующем примере.
import collections list1 = [10, 20, 30, 40, 50, 60] list2 = [10, 20, 30, 50, 40, 70] list3 = [50, 10, 30, 20, 60, 40] # Sorting the list list1.sort() list2.sort() list3.sort() if list1 == list2: print("The list1 and list2 are the same") else: print("The list1 and list3 are not the same") if list1 == list3: print("The list1 and list2 are not the same") else: print("The list1 and list2 are not the same")
The list1 and list3 are not the same The list1 and list2 are not the same
Collection.counter()
Модуль сбора представляет counter(), который эффективно сравнивает список. Он хранит данные в формате словаря : и подсчитывает частоту элементов списка.
Примечание. Порядок элементов списка не имеет значения в этой функции.
import collections list1 = [10, 20, 30, 40, 50, 60] list2 = [10, 20, 30, 50, 40, 70] list3 = [50, 10, 30, 20, 60, 40] if collections.Counter(list1) == collections.Counter(list2): print("The lists l1 and l2 are the same") else: print("The lists l1 and l2 are not the same") if collections.Counter(list1) == collections.Counter(list3): print("The lists l1 and l3 are the same") else: print("The lists l1 and l3 are not the same")
The lists list1 and list2 are not the same The lists list1 and list3 are the same
Reduce() и map()
Функция map() принимает функцию и повторяемый объект Python (список, кортеж, строку и т. д.) в качестве аргументов и возвращает объект. Функция реализуется для каждого элемента списка и в результате возвращает итератор.
Кроме того, метод reduce() рекурсивно реализует данную функцию итерируемому объекту.
Здесь мы будем использовать оба метода в комбинации. Функция map() будет реализовывать функцию (она может быть определяемая пользователем или лямбда-функция) для каждого итеративного объекта, а функция reduce() позаботится о том, чтобы применялся рекурсивный образ.
Примечание. Чтобы использовать функцию reduce(), нужно импортировать модуль functool.
Рассмотрим следующий пример.
import functools list1 = [10, 20, 30, 40, 50] list2 = [10, 20, 30, 50, 40, 60, 70] list3 = [10, 20, 30, 40, 50] if functools.reduce(lambda x, y: x and y, map(lambda a, b: a == b, list1, list2), True): print("The list1 and list2 are the same") else: print("The list1 and list2 are not the same") if functools.reduce(lambda x, y: x and y, map(lambda a, b: a == b, list1, list3), True): print("The list1 and list3 are the same") else: print("The list1 and list3 are not the same")
The list1 and list2 are not the same The list1 and list3 are the same
[РЕШЕНО] Помогите сравнить два списка словарей.
Уважаемые, у меня тут такая задачка нарисовалась..
Есть два списка словарей.
В одном из списков есть или нету дубликаты словарей из другого.
В общем, так или иначе, эти два списка словарей чем-то похожи и чем-то различаются по содержимому.
Не могу найти толкового способа сравнить эти списки и те значения из первого списка, которые есть во втором, отбросить, например или из тех значений, что нет во втором списке, сделать третий список.
Сразу говорю, что сеты не работают. А когда разворачиваю словарь в items, в сет попадают почему-то не все значения.
Пробовал перебор такой:
for p1 in pts1:
if p1 in pts2:
pts1.remove(p1)
Делал так и в один проход — остаются дубликаты, и в несколько таких проходов — pts1 режется до нуля значений 🙁
В общем, я в растерянности. за целый день ничего особенного не придумал 🙁
Помогите, плиз. А то какой-то вроческий кризис совсем прямо 🙁
