Автор оригинала: 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/”