Как найти отличия 2 списков

There are various ways in which the difference between two lists can be generated. In this article, we will see the different ways to Get the difference between two lists which can be done using Python.

Examples:  

Input:
list1 = [10, 15, 20, 25, 30, 35, 40]
list2 = [25, 40, 35] 

Output:
[10, 20, 30, 15]

Explanation:
resultant list = list1 - list2

 Note: When you have multiple same elements then this would not work. In that case, this code will simply remove the same elements.
In that case, you can maintain a count of each element in both lists.

Method 1: Use “in” to Find the Difference Between Two Lists in Python

In this example, we are using loop and Python in keyword to find the difference between two lists in Python.

Python3

li1 = [10, 15, 20, 25, 30, 35, 40]

li2 = [25, 40, 35]

temp3 = []

for element in li1:

    if element not in li2:

        temp3.append(element)

print(temp3)

Output:

[10, 15, 20, 30]

Method 2: Use set() to Find the Difference Between Two Lists in Python

Python3

li1 = [10, 15, 20, 25, 30, 35, 40]

li2 = [25, 40, 35]

s = set(li2)

temp3 = [x for x in li1 if x not in s]

print(temp3)

Output :  

[10, 15, 20, 30]

Method 3:  Use a list comprehension and set to Find the Difference Between Two Lists in Python

In this method, we convert the lists into sets explicitly and then simply reduce one from the other using the subtract operator. For more references on set visit Sets in Python. It is a similar technique that we used previously. The only difference is, that we replaced the nested loops with the list comprehension syntax.

Python3

li1 = [10, 15, 20, 25, 30, 35, 40]

li2 = [25, 40, 35]

s = set(li2)

temp3 = [x for x in li1 if x not in s]

print(temp3)

Output:

[10, 15, 20, 30]

Method 4: Without using the set()

In this method, we use the basic combination technique to copy elements from both lists with a regular check if one is present in the other or not. 

Python3

def Diff(li1, li2):

    li_dif = [i for i in li1 + li2 if i not in li1 or i not in li2]

    return li_dif

li1 = [10, 15, 20, 25, 30, 35, 40]

li2 = [25, 40, 35]

li3 = Diff(li1, li2)

print(li3)

Output : 

[10, 15, 20, 30]

Method 5: Use Numpy to Find the Difference Between Two Lists in Python

The numpy.concatenate() function concatenate a sequence of arrays along an existing axis.

Python3

import numpy as np

li1 = np.array([10, 15, 20, 25, 30, 35, 40])

li2 = np.array([25, 40, 35])

dif1 = np.setdiff1d(li1, li2)

dif2 = np.setdiff1d(li2, li1)

temp3 = np.concatenate((dif1, dif2))

print(list(temp3))

Output:

[10, 15, 20, 30]

Method 6: Use symmetric_difference to Find the Difference Between Two Lists in Python

The elements that are either in the first set or the second set are returned using the symmetric_difference() technique. The intersection, unlike the shared items of the two sets, is not returned by this technique.

Python3

li1 = [10, 15, 20, 25, 30, 35, 40]

li2 = [25, 40, 35]

set_dif = set(li1).symmetric_difference(set(li2))

temp3 = list(set_dif)

print(temp3)

Output:

[20, 10, 30, 15]

Last Updated :
03 Nov, 2022

Like Article

Save Article

В этом посте мы обсудим, как найти разницу между двумя списками в Python. Решение должно возвращать элементы, присутствующие в первом списке, но не во втором списке.

1. Использование set() функция

Простое решение состоит в том, чтобы преобразовать оба списка, чтобы установить структуру данных, а затем вычислить разницу, используя - оператор.

if __name__ == ‘__main__’:

    first = [2, 1, 3, 4, 1]

    second = [3, 4, 5]

    # Функция `set()` используется для создания наборов

    diff = list(set(first) set(second))

    print(diff)        # печатает [1, 2]

Скачать  Выполнить код

2. Использование difference() функция

Объект set также предлагает встроенную функцию difference(), который возвращает новый набор с элементами первого набора, которых нет во втором наборе.

if __name__ == ‘__main__’:

    first = [2, 1, 3, 4, 1]

    second = [3, 4, 5]

    diff = list(set(first).difference(set(second)))

    print(diff)        # печатает [1, 2]

Скачать  Выполнить код

3. Использование понимания списка

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

if __name__ == ‘__main__’:

    first = [2, 1, 3, 4, 1]

    second = [3, 4, 5]

    diff = [x for x in first if x not in second]

    print(diff)    # печатает [2, 1, 1]

Скачать  Выполнить код

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

if __name__ == ‘__main__’:

    first = [2, 1, 3, 4, 1]

    second = [3, 4, 5]

    s = set(second)

    diff = [x for x in first if x not in s]

    print(diff)    # печатает [2, 1, 1]

Скачать  Выполнить код

4. Поиск симметричной разницы

Наконец, если вам нужна симметричная разница между двумя наборами, вы можете использовать symmetric_difference() функция или ^ оператор. Это вернет элементы в любом из списков, но не в обоих.

if __name__ == ‘__main__’:

    first = [2, 1, 3, 4, 1]

    second = [3, 4, 5]

    diff = list(set(first) ^ set(second))

    print(diff)    # печатает [1, 2, 5]

Скачать  Выполнить код

Это все, что касается поиска различий между двумя списками в Python.

  1. Используйте set.difference(), чтобы найти разницу между двумя списками в Python
  2. Используйте set.symmetric_difference(), чтобы найти разницу между двумя списками в Python
  3. Используйте ключевое слово in, чтобы найти разницу между двумя списками в Python
  4. Используйте библиотеку NumPy, чтобы найти разницу между двумя списками в Python

Узнайте разницу между двумя списками в Python

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

В этом руководстве будет продемонстрировано несколько способов различить два списка в Python.

Используйте set.difference(), чтобы найти разницу между двумя списками в Python

Метод set() помогает пользователю преобразовать любую итерацию в повторяемую последовательность, которая также называется набором. Итерируемые объекты могут быть списком, словарем или кортежем.

Функция set.difference() используется для возврата разницы между двумя наборами. Эта функция в основном устраняет общие элементы в двух наборах.

list_1 = [5, 10, 15, 20, 25, 30]
list_2 = [10, 20, 30, 40, 50, 60]

difference_1 = set(list_1).difference(set(list_2))
difference_2 = set(list_2).difference(set(list_1))

list_difference = list(difference_1.union(difference_2))
print(list_difference)

Выход:

Для этого метода первым шагом является сохранение двух списков в двух переменных. Функция set() используется для преобразования этих списков в наборы. На этом же шаге функция set.difference() используется для определения разницы между двумя наборами. Обратите внимание, что переменная difference_1 получает элементы из list_1, а не list_2.

Переменная difference_2 получает элементы, которые находятся в list_2, а не в list_1. После этого функция union используется для получения всех элементов из переменных difference_1 и difference_2. Кроме того, функция list() используется для повторного преобразования обоих наборов в списки. Наконец, распечатывается результирующий список.

Используйте set.symmetric_difference(), чтобы найти разницу между двумя списками в Python

Здесь метод set() используется для первоначального преобразования обоих списков в наборы.

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

list_1 = [5, 10, 15, 20, 25, 30]
list_2 = [10, 20, 30, 40, 50, 60]

set_difference = set(list_1).symmetric_difference(set(list_2))
list_difference = list(set_difference)

print(list_difference)

Выход:

Метод set() также используется для преобразования списков в наборы. После получения разницы функция list() используется для получения и преобразования окончательного набора, как преобразование set_difference обратно в список.

Используйте ключевое слово in, чтобы найти разницу между двумя списками в Python

Ключевое слово in помогает проверить, присутствует ли элемент в повторяющейся последовательности, такой как список, или нет.

В этом методе также используется функция append(). append() используется для добавления элементов в существующий список; он не создает новый список, но изменяет исходный список, добавляя в него элементы.

list_1 = [5, 10, 15, 20, 25, 30]
list_2 = [10, 20, 30, 40, 50, 60]

list_difference = []
for element in list_1:
    if element not in list_2:
        list_difference.append(element)

print(list_difference)

Выход:

В этом методе мы сначала инициализируем окончательный список, который должен быть напечатан с нулевыми элементами. Затем мы используем цикл for, чтобы начать итерацию с первым списком, которым является list_1. После этого мы используем ключевое слово not in, чтобы проверить, находится ли элемент во втором списке или нет.

Наконец, мы используем метод append() для добавления элементов, которых нет во втором списке, в исходный список, то есть list_difference. Однако недостатком этого метода является то, что он не возвращает элементы из второго списка.

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

list_1 = [5, 10, 15, 20, 25, 30]
list_2 = [10, 20, 30, 40, 50, 60]

list_difference = [element for element in list_1 if element not in list_2]

print(list_difference)

Выход:

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

Библиотека Python NumPy – очень часто используемая библиотека. Эта библиотека помогает пользователю выполнять задачи с массивами, матрицами и линейной алгеброй.

В этом методе используются три функции библиотеки NumPy для получения разницы между двумя списками. Этими тремя функциями являются np.array(), np.setdiff1d() и np.concatenate().

Массив – это основная структура данных библиотеки NumPy. Функция np.array() помогает создавать массивы и помогает в работе с ними.

Функция np.setdiff1d() помогает вам найти установленную разницу между двумя массивами и вернуть значения, которые находятся в первом массиве, а не во втором массиве.

Функция np.concatenate используется для объединения двух или более массивов NumPy вместе. Посмотрите пример ниже:

import numpy as np
list_1 = [5, 10, 15, 20, 25, 30]
list_2 = [10, 20, 30, 40, 50, 60]

array_1 = np.array(list_1)
array_2 = np.array(list_2)

difference_1 = np.setdiff1d(array_1, array_2)
difference_2 = np.setdiff1d(array_2, array_1)

list_difference = np.concatenate((difference_1, difference_2))
print(list(list_difference))

Выход:

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

Сравнение – это метод проверки элементов данных одного списка на предмет равенства с элементами данных другого списка.

Содержание

  1. Методы сравнения двух списков
  2. 1. Функции Python reduce() и map()
  3. 2. Метод Python collection.counter()
  4. 3. Метод Python sort() и оператор ==
  5. 4. Метод Python set() и оператор ==
  6. 5. Понимание пользовательского списка

Методы сравнения двух списков

Мы можем использовать любой из следующих методов для сравнения:

  • Функции reduce() и map().
  • Функция collection.counter().
  • sort() вместе с оператором ==.
  • set() вместе с оператором ==.
  • Функция difference().

1. Функции Python reduce() и map()

Мы можем использовать функцию map() вместе с функцией functools.reduce() для сравнения элементов данных двух списков.

Метод map() принимает в качестве аргументов функцию и итерацию, например список, кортеж, строку и т.д.

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

Метод functools.reduce() применяет переданную функцию к каждому элементу итерируемого ввода рекурсивным образом.

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

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

Пример:

import functools 


l1 = [10, 20, 30, 40, 50] 
l2 = [10, 20, 30, 50, 40, 70] 
l3 = [10, 20, 30, 40, 50] 

if functools.reduce(lambda x, y : x and y, map(lambda p, q: p == q,l1,l2), True): 
    print ("The lists l1 and l2 are the same") 
else: 
    print ("The lists l1 and l2 are not the same") 

if functools.reduce(lambda x, y : x and y, map(lambda p, q: p == q,l1,l3), True): 
    print ("The lists l1 and l3 are the same") 
else: 
    print ("The lists l1 and l3 are not the same") 

Выход:

The lists l1 and l2 are not the same
The lists l1 and l3 are the same

2. Метод Python collection.counter()

Метод collection.counter() можно использовать для эффективного сравнения списков. Функция counter() подсчитывает частоту элементов в списке и сохраняет данные в виде словаря в формате <значение>: <частота>.

Если два списка имеют одинаковый вывод словаря, мы можем сделать вывод, что списки одинаковы.

Примечание. Порядок в списке не влияет на метод counter().

Пример:

import collections 


l1 = [10, 20, 30, 40, 50] 
l2 = [10, 20, 30, 50, 40, 70] 
l3 = [10, 20, 30, 40, 50] 

if collections.Counter(l1) == collections.Counter(l2):
    print ("The lists l1 and l2 are the same") 
else: 
    print ("The lists l1 and l2 are not the same") 

if collections.Counter(l1) == collections.Counter(l3):
    print ("The lists l1 and l3 are the same") 
else: 
    print ("The lists l1 and l3 are not the same") 

Выход:

The lists l1 and l2 are not the same
The lists l1 and l3 are the same

3. Метод Python sort() и оператор ==

Мы можем объединить метод sort() с оператором == для сравнения двух списков.

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

Примечание. Порядок в списке не влияет на этот метод, потому что мы будем сортировать списки перед сравнением.

Кроме того, оператор == используется для сравнения списка элемент за элементом.

Пример:

import collections 


l1 = [10, 20, 30, 40, 50] 
l2 = [10, 20, 30, 50, 40, 70] 
l3 = [50, 10, 30, 20, 40] 

l1.sort() 
l2.sort() 
l3.sort() 

if l1 == l3: 
    print ("The lists l1 and l3 are the same") 
else: 
    print ("The lists l1 and l3 are not the same") 


if l1 == l2: 
    print ("The lists l1 and l2 are the same") 
else: 
    print ("The lists l1 and l2 are not the same") 

Выход:

The lists l1 and l3 are the same
The lists l1 and l2 are not the same

4. Метод Python set() и оператор ==

Метод set() манипулирует элементами данных итерации до отсортированного набора элементов данных, не принимая во внимание порядок элементов.

Кроме того, оператор == используется для поэлементного сравнения элементов данных списка.

Пример:

l1 = [10, 20, 30, 40, 50] 
l3 = [50, 10, 30, 20, 40] 

a = set(l1)
b = set(l3)

if a == b:
    print("Lists l1 and l3 are equal")
else:
    print("Lists l1 and l3 are not equal")

Выход:

Lists l1 and l3 are equal

Мы можем использовать List в Python для сравнения двух списков.

Пример:

l1 = [10, 20, 30, 40, 50] 
l3 = [50, 75, 30, 20, 40, 69] 

res = [x for x in l1 + l3 if x not in l1 or x not in l3]

print(res)
if not res:
    print("Lists l1 and l3 are equal")
else:
    print("Lists l1 and l3 are not equal")

 

В приведенном выше коде мы устанавливаем элемент указателя «x» на список l1 и l3. Далее мы проверяем, присутствует ли элемент, на который указывает элемент-указатель, в списках.

Выход:

[10, 75, 69]
Lists l1 and l3 are not equal

Имеется три списка: список1, список2 и список3.

Известно, что список1 > список2 (по количеству элементов), а список3 – пустой.

Также известно, что первые элементы список1 и список2 одинаковые (например, список1 = [Вася, Петя, Маша, Саша], а список2 = [Вася, Петя]).

Задача: заполнить список3 разностью первого и второго списков, т.е. на приведённом примере список3 = [Маша, Саша].

Timofei Bondarev's user avatar

задан 22 июл 2011 в 12:08

Izengardjke's user avatar

IzengardjkeIzengardjke

5221 золотой знак6 серебряных знаков23 бронзовых знака

1

Навскидку (т.к. set, элементы на выходе будут уникальными, т.е. без повторений) + не важно какие индексы у элементов, которые есть в обоих списках:

list1 = [u'Вася', u'Петя', u'Маша', u'Саша']   
list2 = [u'Вася', u'Петя'] 
list3=list(set(list1)-set(list2))  
print list3  
[u'Маша', u'Саша']

ответ дан 22 июл 2011 в 12:24

Андрей Басалыга's user avatar

1

Используйте Set. Вот пример из документации.

>>> from sets import Set
>>> engineers = Set(['John', 'Jane', 'Jack', 'Janice'])
>>> programmers = Set(['Jack', 'Sam', 'Susan', 'Janice'])
>>> managers = Set(['Jane', 'Jack', 'Susan', 'Zack'])
>>> employees = engineers | programmers | managers           # union
>>> engineering_management = engineers & managers            # intersection
>>> fulltime_management = managers - engineers - programmers # difference

difference – это и будет разница

UPD:
Опередили меня. 🙂

ответ дан 22 июл 2011 в 12:26

Antik's user avatar

  • Заведомо известно, что список 1 > список2
  • Также известно, что первые элементы список1 и список2 одинаковые

Если выполнение этих условий гарантируется, то самым простым и самым быстрым будет решение:

list3 = list1[len(list2):]

ответ дан 22 июл 2011 в 13:31

Ilya Pirogov's user avatar

Ilya PirogovIlya Pirogov

10.9k1 золотой знак20 серебряных знаков29 бронзовых знаков

1

Что-то вроде этого:

list1 = ['1', '2', '3',]
list2 = ['1', '3',]
for item in list2:
    if item in list1:
        list1.remove(item)
#Искомый - list1

Я правильно понял ваш вопрос? Тут только вычёркивание элементов второго списка из первого.

ответ дан 22 июл 2011 в 12:32

metazet's user avatar

metazetmetazet

2,7582 золотых знака17 серебряных знаков26 бронзовых знаков

2

Для этого в python есть специальный ТД “множество” – set. С ним все делается просто и легко.

list1 = ['Вася', 'Петя', 'Маша', 'Саша']
list2 = ['Вася', 'Петя']

set1 = set(list1)
set2 = set(list2)
list3 = list( set1.difference(set2) )

ответ дан 3 авг 2011 в 18:31

fogbit's user avatar

fogbitfogbit

3,44611 серебряных знаков9 бронзовых знаков

>>> lst1 = ['Вася', 'Петя', 'Маша', 'Саша']
>>> lst2 = ['Вася', 'Петя']
>>> lst3 = [i for i in lst1 if i not in lst2]
>>> lst3
['Маша', 'Саша']
>>>

а множества не гарантируют сохранение порядка элементов

может получиться

['Саша', 'Маша']

ответ дан 23 июл 2011 в 3:03

adjust's user avatar

adjustadjust

512 бронзовых знака

Добавить комментарий