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

Разница в списке |. Самый питон путь

Краткий ответ: Самый питонический способ вычислить разницу между двумя списками L1 и L2 – это оператор понимания списка [x для x в L1, если x не в set (l2)]. Это работает, даже если у вас есть дублирующие записи списка, он поддерживает оригинальный список списка, и это эффективно из-за постоянной сложности выполнения … Разница в списке | Самый питонический путь Подробнее »

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

Краткий ответ : Самый питонический способ вычислить разницу между двумя списками 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]

В Python у вас всегда есть несколько способов решения такой же (или аналогичной) проблемы. Давайте обзором в следующем интерактивном коде оболочку:

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

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

Метод 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 значительным запасом.

Оценка эффективности

Хотите узнать самый исполнительный? В следующем я протестировал три разных подхода:

import timeit

init = 'l1 = list(range(100)); l2 = list(range(50))'

# 1. Set Conversion
print(timeit.timeit('list(set(l1) - set(l2))', init, number = 10000))

# 2. List Comprehension
print(timeit.timeit('[x for x in l1 if x not in l2]', init, number = 10000))

# 3. List Comprehension + set
print(timeit.timeit('s = set(l2);[x for x in l1 if x not in s]', init, number = 10000))
'''
0.1620231000000001
0.5186101000000001
0.057180300000000184
'''

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

Упражнение : Запустите код. Что быстрее всего и почему?

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

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

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

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

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

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

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

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

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

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

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

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

Оригинал: “https://blog.finxter.com/list-difference/”