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

Как проверить, являются ли элементы в списке Python в другом

Приходит время во всех наших кодировках, когда нам нужно сравнить списки, чтобы понять, появляются ли элементы в одном списке во втором списке. https://youtu.be/HWJn1IbjdIw В этой статье мы начнем, где мы все начали, используя для петлей, прежде чем перейти к более классическому пониманию списка Python. Затем мы выйдем за пределы этого для использования … Как проверить, если элементы в списке Python также в другом Подробнее »

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

Есть время во всем нашем кодировке жизни, когда нам нужно Сравнить списки Чтобы понять, стоит ли Предметы в одном списке появляются во втором списке.

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

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

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

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

Таким образом, если бы мы начали в кодировке Python, мы бы использовали для цикла для перебрания с двумя списками и возвращать результат. В примерах, которые мы впервые вернемся к True/False на то, есть ли номер в списке C также в списке A. Затем мы возвращаем фактические числа из списка C, которые находятся в списке A.

# Main list
lst_a = [24, 17, 37, 16, 27, 13, 46, 40, 46, 51,
         44, 29, 54, 77, 78, 73, 40, 58, 32, 48,
         45, 55, 51, 59, 68, 34, 83, 65, 57, 50,
         57, 93, 62, 37, 70, 62
	   ]

# SOME items are in lst_a
lst_c = [93, 108, 15, 42, 27, 83]


# Empty list
lst_result = []
# Check True or False items are in both lists
for i in lst_c:
    for j in lst_a:
        if i == j:
            print(True, end=' ')
        else:
            continue
print('\n')
# Return values that are in both lists
for i in lst_c:
    for j in lst_a:
        if i == j:
            lst_result.append(i)
        else:
            continue
print(lst_result)
# Result #
True True True 
[93, 27, 83]

Так что это нормально, насколько это идет; Мы ответили на вопрос. Тем не менее, потребовалось шесть строк кода для истинного/ложного запроса и еще одной шести строки кода плюс создание нового списка для определения фактических чисел, которые были общими для обоих списков. Использование понимания списка мы можем улучшить это.

Метод 2: Лямбда

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

# Main list
lst_a = [24, 17, 37, 16, 27, 13, 46, 40, 46, 51,
         44, 29, 54, 77, 78, 73, 40, 58, 32, 48,
         45, 55, 51, 59, 68, 34, 83, 65, 57, 50,
         57, 93, 62, 37, 70, 62
         ]

# SOME items are in lst_a
lst_c = [93, 108, 15, 42, 27, 83]

print(list(filter(lambda i: i in lst_a, lst_c)))
# Result #
[93, 27, 83]

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

 # Main list
lst_a = [24, 17, 37, 16, 27, 13, 46, 40, 46, 51,
         44, 29, 54, 77, 78, 73, 40, 58, 32, 48,
         45, 55, 51, 59, 68, 34, 83, 65, 57, 50,
         57, 93, 62, 37, 70, 62
         ]

# SOME items are in lst_a
lst_c = [93, 108, 15, 42, 27, 83]

print([True for i in lst_a if i in lst_c], '\n')

print([i for i in lst_a if i in lst_c])

# Result #
[True, True, True] 
[27, 83, 93]

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

Способ 3: Python’s Any () и All () встроенные функции

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

Функция любой () Проверяет, есть ли какие-либо из элементов в списке Правда и возвращает соответствующую Правда Отказ   Вот простой пример того, как он работает:

a = [True, False, True, False, True]
print(any(a))
# Result #
True

Это просто, так что давайте применим его к нашему списку примеров. Я снова скриншот все списки, чтобы спасти вас от прокрутки. Поэтому, если мы хотим простую версию/ложную реакцию на наш вопрос относительно того, есть ли какие-либо элементы в одном списке в другом, любой () подходит для нашей потребности.

print(any(x in lst_a for x in lst_b))
print(any(x in lst_a for x in lst_c))
print(any(x in lst_a for x in lst_d))

# Result #
True
True
False

Помните, что lst_b Элементы все в lst_a ; lst_c имеет некоторые из его предметов в lst_a и lst_d не имеет никаких предметов в lst_a Отказ Поэтому возвращение Правда , Правда , Ложь имеет смысл как третий список, lst_d не имеет никаких предметов, дублированных в lst_a.

Проблема с этим методом заключается в том, что он не говорит вам, если все элементы в одном списке в другом, только что некоторые. Если вам нужна эта степень точности, встроенная функция все () могу сделать это для вас.

# Main list
lst_a = [24, 17, 37, 16, 27, 13, 46, 40, 46, 51,
         44, 29, 54, 77, 78, 73, 40, 58, 32, 48,
         45, 55, 51, 59, 68, 34, 83, 65, 57, 50,
         57, 93, 62, 37, 70, 62
         ]

# ALL items are in lst_a
lst_b = [59, 37, 32, 40]

# SOME items are in lst_a
lst_c = [93, 108, 15, 42, 27, 83]

# NO items are in lst_a
lst_d = [23, 101, 63, 35]

print(all(x in lst_a for x in lst_b))
print(all(x in lst_a for x in lst_c))
print(all(x in lst_a for x in lst_d))
# Result #
True
False
False

Таким образом, в этом случае единственный список, который имеет все свои предметы, содержащиеся в lst_a это lst_b С Следовательно, Правда Отказ

Эти две функции любой () и все () полезны, предоставляют читаемый код и краже, но в основном списке понимание ранее, мы также смогли перечислить фактическое Дубликат Предметы. Пока вы могли бы сделать это, используя любой () и все () Дополнительный код, чтобы сделать его работу, просит вопрос о том, почему вы надоели, так что давайте оставим этих двух, чтобы вернуться только Правда или Ложь и обратить наше внимание на некоторые разные подходы.

Способ 4: введение типа и методы набора () ()

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

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

issubset () – возвращает ли другой набор этот набор или нет

Пересечение () – Возвращает набор, то есть пересечение двух других наборов

И вот код, использующий оба метода на каждом из наших трех сравнений списка.

# Main list
lst_a = [24, 17, 37, 16, 27, 13, 46, 40, 46, 51,
         44, 29, 54, 77, 78, 73, 40, 58, 32, 48,
         45, 55, 51, 59, 68, 34, 83, 65, 57, 50,
         57, 93, 62, 37, 70, 62
         ]

# ALL items are in lst_a
lst_b = [59, 37, 32, 40]

# SOME items are in lst_a
lst_c = [93, 108, 15, 42, 27, 83]

# NO items are in lst_a
lst_d = [23, 101, 63, 35]

print(set(lst_b).issubset(lst_a))
print(set(lst_c).issubset(lst_a))
print(set(lst_d).issubset(lst_a), '\n')

print(list(set(lst_a).intersection(set(lst_b))))
print(list(set(lst_a).intersection(set(lst_c))))
print(list(set(lst_a).intersection(set(lst_d))))

# Result #
True
False
False 

[32, 40, 59, 37]
[27, 83, 93]
[]

Обратите внимание, что в обоих случаях нам нужно Преобразуйте списки в наборы используя set (lst_a) , set (lst_b) Синтаксис показан, прежде чем разрешить метод пересечения выполнять его работу. Если вы хотите, чтобы ответ был возвращен в виде списка, вам нужно будет преобразовать ответ, используя Список () Команда, как показано. Если это не важно для вас, вы сохраните немного кода и верните набор.

Методы 5-7: три бонусных метода

Во время движения слегка вдали от нашего оригинального вопроса о том, есть ли предметы в одном списке в другом, есть три других метода в SET (), которые могут удовлетворить ваши потребности в составлении сопоставления списка, хотя ответы, которые они возвращают подходят к проблеме с другого угла. Эти:

Разница () – возвращает набор, содержащий разницу между двумя или более наборами

iSdisjoint () – возвращает, имеют ли два набора пересечения или нет

ОСУПЕРСЕТ () – возвращает, содержит ли один набор другой набор или нет

Как вы можете сказать из описания, они эффективно обратный от того, что мы сделали ранее с Пересечение () и issubset () Отказ

Используя нашими примерами кода, Разница () вернется номера в lst_a. Это не в lst_b С c или d в то время как iSdisjoint () вернется Ложь Если есть пересечение и Правда Если нет (что кажется немного контрактвым, пока вы не задумываете на имя метода), а ОСУПЕРСЕТ () проверим ли наши большие lst_a Содержит меньший lst_b С c или D в целом.

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

# Main List
lst_a = [24, 17, 37, 16, 27, 13, 46, 40, 46, 51,
         44, 29, 54, 77, 78, 73, 40, 58, 32, 48,
         45, 55, 51, 59, 68, 34, 83, 65, 57, 50,
         57, 93, 62, 37, 70, 62
         ]
# ALL items are in lst_a
lst_b = [59, 37, 32, 40]

# SOME items are in lst_a
lst_c = [93, 108, 15, 42, 27, 83]

# NO items are in lst_a
lst_d = [23, 101, 63, 35]

print(set(lst_a).isdisjoint(lst_b))
print(set(lst_a).isdisjoint(lst_c))
print(set(lst_a).isdisjoint(lst_d), '\n')

print(list(set(lst_a).difference(set(lst_b))))
print(list(set(lst_a).difference(set(lst_c))))
print(list(set(lst_a).difference(set(lst_d))), '\n')

print(set(lst_a).issuperset(set(lst_b)))
print(set(lst_a).issuperset(set(lst_c)))
print(set(lst_a).issuperset(set(lst_d)))
# Result #
False
False
True 

[65, 68, 70, 73, 13, 77, 78, 16, 17, 83, 24, 27, 29, 93, 34, 44, 45, 46, 48, 50, 51, 54, 55, 57, 58, 62]

[65, 68, 70, 73, 13, 77, 78, 16, 17, 24, 29, 32, 34, 37, 40, 44, 45, 46, 48, 50, 51, 54, 55, 57, 58, 59, 62]

[65, 68, 70, 73, 13, 77, 78, 16, 17, 83, 24, 27, 29, 93, 32, 34, 37, 40, 44, 45, 46, 48, 50, 51, 54, 55, 57, 58, 59, 62] 

True
False
False

Рискуют трудоустроить точку, помните, что iSdisjoint () вернется Ложь Если какие-либо элементы в одном списке появляются в другом. Это будет возвращаться только Правда Когда два списка полностью разделяются без каких-либо дублирования.

В итоге

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

  • Мы начали с базового понимания списка, используя для -лоп, прежде чем проверять, если лямбда выражение было более подходящим. Наконец, мы заключили в однострочное понимание списка, которые вернулись Правда или Ложь О том, был ли элемент каждого списка в другом списке. Мы также использовали однострочное понимание списка для возврата фактических значений дубликатов в виде списка.
  • Затем мы изучили встроенные функции Python любой () и все () Что возвращает True или False в зависимости от того, повторяются ли какие-либо элементы в одном списке в другом.
  • Наконец, мы представили некоторые из методов, используемых в рамках Установить () тип данных. Использование issubset () Мы смогли вернуть True или False на ли элементы списка дублированы в другом списке и используя Пересечение () Мы вернули значения дублированных предметов.
  • Как бонус, мы также представили некоторые другие Установить () Методы, которые позволили нам дальнейшее манипулировать спискими для возврата полезных данных.

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

Чтобы исследовать встроенные функции Python, я предлагаю начать здесь; https://blog.finxter.com/python-built-in-functions/

Для хорошего начала с пониманием списка попробуйте эту статью; https://blog.finxter.com/list-comprehension/

Если вы хотите узнать больше о записи кода одноклассника, вы не можете пройти через эту книгу; https://www.amazon.com/gp/product/B07ZY7XMX8

Я надеюсь, что вам понравилось статью. Спасибо за прочтение!

Оригинал: “https://blog.finxter.com/how-to-check-if-items-in-a-python-list-are-also-in-another/”