Сравнение списков в Python — штука, с которой сталкивался каждый, кто хоть раз писал что-то сложнее “Hello, World!”. Нужно выяснить, чем два списка похожи, чем отличаются, что появилось, а что исчезло. Вроде бы просто, но как только начинаешь работать с большими данными или сложными структурами, быстро становится понятно: не всё так очевидно.
Возможности
Python даёт кучу способов сравнивать списки: стандартные операторы (==
, !=
), списковые включения, set-ы, модули вроде difflib
. Для сложных кейсов — сторонние библиотеки (deepdiff и др.). Можно сравнивать списки целиком, поэлементно, искать разницу, пересечение, уникальные элементы. Всё зависит от задачи.
Что требуется
- Python 3.7+ (рекомендую свежий, но подойдёт любой поддерживаемый)
- pip (или poetry, если любишь заморачиваться)
- Железо — хватит самого простого, unless ты сравниваешь миллионные списки
- ОС — Linux, macOS, Windows, всё окей
Установка — пошаговая инструкция
- Проверяем Python:
python --version
илиpython3 --version
- Устанавливаем pip (если надо):
python -m ensurepip --upgrade
- Ставим deepdiff для продвинутого сравнения:
pip install deepdiff
Официальная страница: DeepDiff Docs
- Для визуального сравнения — difflib (встроен в стандартную библиотеку):
import difflib
— ничего ставить не нужно - Если хочется поиграться с pandas (для табличных списков):
pip install pandas
Официальная страница: pandas
Использование: полный список команд и вариантов
1. Банальное сравнение на равенство
list1 = [1, 2, 3]
list2 = [1, 2, 3]
print(list1 == list2) # True
print(list1 is list2) # False (разные объекты)
2. Поиск разницы через set
list1 = [1, 2, 3, 4]
list2 = [3, 4, 5, 6]
diff1 = set(list1) - set(list2) # {1, 2}
diff2 = set(list2) - set(list1) # {5, 6}
print(diff1, diff2)
⚠️ Внимание: set убивает дубликаты и порядок!
3. Сравнение списков с вложенными структурами через deepdiff
from deepdiff import DeepDiff
list1 = [{'a': 1}, {'b': 2}]
list2 = [{'a': 1}, {'b': 3}]
diff = DeepDiff(list1, list2)
print(diff)
4. Поэлементное сравнение
for a, b in zip(list1, list2):
if a != b:
print(f'Difference: {a} vs {b}')
5. difflib — “человеческая” разница
import difflib
list1 = ['apple', 'banana', 'cherry']
list2 = ['apple', 'banana', 'pear']
diff = difflib.unified_diff(list1, list2, lineterm='')
print('\n'.join(diff))
6. pandas — если списки похожи на таблицы
import pandas as pd
df1 = pd.DataFrame({'col': [1, 2, 3]})
df2 = pd.DataFrame({'col': [2, 3, 4]})
diff = pd.concat([df1, df2]).drop_duplicates(keep=False)
print(diff)
Ошибки, как делать не надо
- Сравнивать списки set-ами, если важен порядок или дубликаты
set([1, 2, 2, 3]) == set([1, 2, 3, 3]) # True, но списки-то разные!
- Ожидать, что
==
сравнит вложенные объекты “глубоко”
Для сложных структур — только DeepDiff или что-то похожее. - Сравнивать списки разной длины через
zip()
без проверки
zip([1,2,3], [1,2])
сравнит только первые два элемента, остальное проигнорит.
Пример реального использования в окружении
Ситуация: есть два файла с конфигами серверов. Нужно понять, какие параметры добавились, а какие выпилили за неделю.
import difflib
with open('config_old.txt') as f1, open('config_new.txt') as f2:
old = f1.readlines()
new = f2.readlines()
diff = difflib.unified_diff(old, new, fromfile='old', tofile='new')
print(''.join(diff))
Для сложных структур (например, списки словарей):
from deepdiff import DeepDiff
import json
with open('old.json') as f1, open('new.json') as f2:
old = json.load(f1)
new = json.load(f2)
diff = DeepDiff(old, new)
print(diff)
Заключение
Сравнение списков в Python — не rocket science, но нюансов хватает. Для простых случаев хватит стандартных средств, для сложных — deepdiff и pandas. Всегда думай, что именно ты сравниваешь: порядок, дубликаты, вложенность. Не бойся экспериментировать, но не забывай про грабли. Если что — официальная документация difflib, доки DeepDiff и pandas docs всегда под рукой.
Ваш отзыв