Рубрики
Без рубрики

Самый питонический способ сравнить два списка в Python

Проблема: Данные два списка L1 и L2. Вы хотите выполнить либо из следующего: 1. Логическое сравнение: сравните список списков и вернитесь и вернитесь, если ваша метрика сравнения возвращает TRUE для всех пар элементов, и в противном случае flase.2. Разница: найти разницу в элементах в первом списке, но не во втором. … Самый питонический способ сравнить два списка в Python Подробнее »

Автор оригинала: Chris.

Проблема : Данные два списка L1 и L2 Отказ Вы хотите выполнить любой из следующих действий:

  • 1 Логическое сравнение : Сравните списки элемент-мудрых и возврат Правда Если ваша метрика сравнения возвращается Правда Для всех пар элементов и в противном случае Ложь Отказ
  • 2 Разница : Найдите разницу в элементах в первом списке, но не во втором.

Пример : Вы начинаете с двух списков.

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]

# 1. Boolean Comparison
result = False

# 2. Difference
result = [4, 5]

Давайте обсудим самые питонные способы достижения этих проблем. Мы начинаем с пяти способов выполнить логическое сравнение и посмотреть на пять способов выполнить простую разницу, затем.

Логическое сравнение

Краткий ответ: Самый питонический способ проверить, если два заказанных списка L1 и L2 идентичны, это использовать L1 Оператор для элементарного сравнения. Если все элементы равны, и длина списков одинаковы, возвращаемое значение – Правда Отказ

Проблема : Данные два Списки L1 и L2 Отказ Вы хотите выполнить Логическое сравнение : Сравните списки элемент-мудрых и возврат Правда Если ваша метрика сравнения возвращается Правда Для всех пар элементов и в противном случае Ложь Отказ

Примеры :

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]
# compare(l1, l2) --> False

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3, 5, 4]
# compare(l1, l2) --> False

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3, 4, 5]
# compare(l1, l2) --> True

Давайте обсудим самые питонные способы решения этой проблемы. Вот быстрое интерактивное обзор кода:

Упражнение : Загляните на все методы и запустите код. Какие вопросы приходят на ум? Вы понимаете каждый метод?

Читайте дальше, чтобы узнать о каждом методе подробно!

Метод 1: Простое сравнение

Не всегда самый простым методом лучший. Но для этой конкретной проблемы это! Оператор равенства == сравнивает список элемент-мудрый -Мелые кодеры Python не знают этого!

# 1. Simple Comparison
def method_1(l1, l2):
    return l1 == l2

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]
print(method_1(l1, l2))
# False

Итак, если вы просто хотите узнать о самом питоновом пути решить эту проблему, не смотрите дальше.

Но если вы хотите погрузиться в замечательный мир Python, узнав о разных интересных и мощных функциях Python, читайте!

Способ 2: просто для цикла

Следующий метод – это то, что вы увидите из кодера, исходящего из другого Язык программирования Или от новичка, который не знает о операторе равенства в списках (см. Метод 1 ).

# 2. Simple For Loop
def method_2(l1, l2):
    for i in range(min(len(l1), len(l2))):
        if l1[i] != l2[i]:
            return False
    return len(l1) == len(l2)

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]
print(method_2(l1, l2))
# False

В коде вы повторяете все индексы от 0 до последней позиции наименьшего списка, как определено частью Мин (Лен (L1), Лен (L2)) Отказ Затем вы проверяете, отличаются ли оба элементами в той же положении. Если они разные, то есть l1 [я] [я] Вы можете сразу же вернуться Ложь Потому что списки тоже разные.

Если вы проходили в целом петля без возврата Ложь элементы списка похожи. Но один список все еще может быть дольше! Итак, возвращая Лен (L1) (L2) , вы гарантируете только возвращение Правда Если (1) все элементы равны и (2) списки имеют одинаковую длину.

Много кода для достижения такой простой вещи! Давайте посмотрим, как лучший кодер будет использовать zip () Функция для уменьшения сложность кода.

Метод 3: ZIP () + для цикла

То ZIP функция Занимает ряд поручений и агрегаты их в один, объединяя I-TH значений каждого повторного кортежа в кортеж для каждого I.

Давайте посмотрим, как вы можете использовать функцию, чтобы сделать предыдущий код более кратко:

# 3. Zip + For Loop
def method_3(l1, l2):
    for x, y in zip(l1, l2):
        if x != y:
            return False
    return len(l1) == len(l2)

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]
print(method_3(l1, l2))
# False

Вместо того, чтобы итерация по индексам, вы сейчас переживайте на пары элементов (вместе назащиты). Если списки имеют разные размеры, остальные элементы из более длинного списка будут пропущены. Таким образом, элементное сравнение становится проще, и никаких сложных схем индексации не требуется. Избегая индексов с помощью zip () Функция наверняка является более питонным способом!

Метод 4: сумма () + zip () + len ()

Но True Python Coders часто избегают петли для цикла и вместо этого используют выражение генератора.

  • Сначала вы создаете счетчику логических значений, используя выражение генератора x для x, y в zip (l1, l2) Отказ
  • Тогда ты сумма по поводу логических ценностей (еще один трюк про кодеров Pro), чтобы найти количество элементов, которые одинаковы и хранят его в переменной num_equal Отказ
  • Наконец, вы сравниваете это с длиной обоих списков. Если все три значения одинаковы, оба списка имеют одни и те же элементы, и их длина тоже одинаково. Они равны!
# 4. Sum + Zip + Len
def method_4(l1, l2):
    num_equal = sum(x == y for x, y in zip(l1, l2))
    return num_equal == len(l1) == len(l2)

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]
print(method_4(l1, l2))
# False

print(method_4([1, 2], [1, 2]))
# True

Из способов, кроме первого, используя == Оператор, это самый питоновый способ из-за использования эффективных функций помощника помощников Python, таких как zip () , Лен () и сумма () и выражения генератора, чтобы сделать код более лаконичным и более читаемым.

Вы также можете написать это в Одна линия Кодекс!

sum(x == y for x, y in zip(l1, l2)) == len(l1) == len(l2)

Если вы любите Python One-Listers, проверьте мою новую книгу Python One-listers с международно известным издателем Nostarch Press. (Amazon Link)

Метод 5: Карта () + Уменьшить () + Лен ()

Последний метод – просто тренировать свои функциональные навыки программирования.

# 5. map() + reduce() + len()
from functools import reduce
def method_5(l1, l2):
    equal = map(lambda x, y: x == y, l1, l2)
    result = reduce(lambda x, y: x and y, equal)
    return result and len(l1) == len(l2)

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]
print(method_5(l1, l2))
# False

print(method_5([1, 2, 3], [1, 2, 3]))
# True

Карта () Функция Сочетает в себе все пары элементов к логическим значениям (два элемента равны?). Re DUCE () Функция сочетает в себе все логические значения, выполняющие и операция. Конечно, вы также можете использовать более лаконичный вариант, используя Все () Функция:

Метод 6: Карта () + Все ()

Это то же самое, что и предыдущий метод, но используя All () Функция вместо Уменьшить () объединить все логические значения в глобальном и операция.

# 6. map() + all()
def method_6(l1, l2):
    result = all(map(lambda x, y: x == y, l1, l2))
    return result and len(l1) == len(l2)

l1 = [1, 2, 3, 4, 5]
l2 = [1, 2, 3]
print(method_5(l1, l2))
# False

print(method_5([1, 2, 3], [1, 2, 3]))
# True

Если вы хотите узнать что-то новое каждый день, присоединяйтесь к моей бесплатной серии электронной почты Python для постоянного улучшения в Python и информатике.

Оригинальная статья: Самый питонический способ проверить, будут ли два упорядоченных списка идентичны

Разница

Краткий ответ : Самый питонический способ вычислить разницу между двумя списками L1 и L2 это заявление о понимании списка [X для X в L1, если x не в наборе (L2)] Отказ Это работает, даже если у вас есть дубликаты списка записей, он поддерживает оригинальный список списка, и это эффективно из-за сложности постоянной среды времени выполнения заданного операции членства.

Какой лучший способ вычислить разницу между двумя списками в Python?

a = [5, 4, 3, 2, 1]
b = [4, 5, 6, 7]

# a - b == [3, 2, 1]
# b - a == [6, 7]

Давайте обзором в следующем интерактивном коде оболочку:

Упражнение : Запустите код и подумайте о своем предпочтительном порядке!

Давайте погрузимся в каждый из методов, чтобы найти самый питон один для вашего конкретного сценария.

Метод 1: Установленная разница

Наивный подход к решению этой проблемы состоит в том, чтобы преобразовать оба списка наборы и использовать набор минус (или установить разницу).

# Method 1: Set Difference
print(set(a) - set(b))
# {1, 2, 3}
print(set(b) - set(a))
# {6, 7}

Этот подход элегантный, потому что он читается, эффективный и краткий.

Тем не менее, есть некоторые уникальные свойства для этого метода, который вы должны знать:

  • Результатом является Установить а не список Отказ Вы можете конвертировать Это обратно в список, используя Список (...) конструктор.
  • Все Дублировали Список записей удаляются в процессе, поскольку наборы не могут иметь дублированные элементы.
  • Порядок исходного списка теряется, потому что наборы не поддерживают упорядоченность элементов.

Если все три свойства приемлемы для вас, это безусловно, наиболее эффективный подход, как оценивается позже в этой статье!

Тем не менее, как вы можете сохранить порядок исходных элементов списка, а также разрешают дубликаты? Давайте погрузимся в Понимание списка Альтернатива!

Метод 2: Понимание списка

Понимание списка является компактным способом создания списков. Простая формула – [Выражение + контекст] Отказ

  • Выражение : Что делать с элементом каждого списка?
  • Контекст : Какие элементы для выбора? Контекст состоит из произвольного количества для и Если заявления.

Вы можете использовать список списков, чтобы перейти на все элементы в первом списке, но игнорируйте их, если они во втором списке:

# Method 2: List Comprehension
print([x for x in a if x not in set(b)])
# [3, 2, 1]

Мы использовали небольшую, но эффективную оптимизацию преобразования второго списка B на множество первых. Причина в том, что проверка членства х в b много быстрее для наборов, чем для списков Отказ Однако семантически обе варианты идентичны.

Вот отличительные свойства этого подхода:

  • Результатом заявления об понимании списка является список.
  • Орден оригинального списка сохраняется.
  • Дублирующие элементы поддерживаются.

Если вы полагаетесь на эти более мощные гарантии, используйте подход к пониманию списка, потому что это самый питонический.

Метод 3: Простой для цикла

Удивительно, что некоторые онлайн-учебные пособия рекомендуют использовать вложенные для цикла (например, эти парни ):

# Method 3: Nested For Loop
d = []
for x in a:
    if x not in b:
        d.append(x)
print(d)
# [3, 2, 1]

На мой взгляд, этот подход будет использоваться только абсолютными новичками или кодерами, которые приходят с другими языками программирования, такие как C ++ или Java, и не знают существенных функций Python, как Список понимания Отказ Вы можете оптимизировать этот метод, конвертируя список B Сначала набор, чтобы ускорить чек Если х не в b значительным запасом.

Оригинальная статья : Разница в списке |. Самый питон путь

Куда пойти отсюда?

Достаточно теории, давайте познакомимся!

Чтобы стать успешным в кодировке, вам нужно выйти туда и решать реальные проблемы для реальных людей. Вот как вы можете легко стать шестифункциональным тренером. И вот как вы польские навыки, которые вам действительно нужны на практике. В конце концов, что такое использование теории обучения, что никто никогда не нуждается?

Практические проекты – это то, как вы обостряете вашу пилу в кодировке!

Вы хотите стать мастером кода, сосредоточившись на практических кодовых проектах, которые фактически зарабатывают вам деньги и решают проблемы для людей?

Затем станьте питоном независимым разработчиком! Это лучший способ приближения к задаче улучшения ваших навыков Python – даже если вы являетесь полным новичком.

Присоединяйтесь к моему бесплатным вебинаре «Как создать свой навык высокого дохода Python» и посмотреть, как я вырос на моем кодированном бизнесе в Интернете и как вы можете, слишком от комфорта вашего собственного дома.

Присоединяйтесь к свободному вебинару сейчас!

Работая в качестве исследователя в распределенных системах, доктор Кристиан Майер нашел свою любовь к учению студентов компьютерных наук.

Чтобы помочь студентам достичь более высоких уровней успеха Python, он основал сайт программирования образования Finxter.com Отказ Он автор популярной книги программирования Python одноклассники (Nostarch 2020), Coauthor of Кофе-брейк Python Серия самооставленных книг, энтузиаста компьютерных наук, Фрилансера и владелец одного из лучших 10 крупнейших Питон блоги по всему миру.

Его страсти пишут, чтение и кодирование. Но его величайшая страсть состоит в том, чтобы служить стремлению кодер через Finxter и помогать им повысить свои навыки. Вы можете присоединиться к его бесплатной академии электронной почты здесь.