Получить разницу между двумя списками - PullRequest
671 голосов
/ 11 августа 2010

У меня есть два списка в Python, например:

temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two']

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

temp3 = ['Three', 'Four']

Есть ли быстрые пути без циклов и проверки?

Ответы [ 26 ]

2 голосов
/ 13 октября 2018

Допустим, у нас есть два списка

list1 = [1, 3, 5, 7, 9]
list2 = [1, 2, 3, 4, 5]

. Из приведенных выше двух списков видно, что пункты 1, 3, 5 существуют в списке 2, а пункты 7, 9 - нет.С другой стороны, пункты 1, 3, 5 существуют в списке 1, а пункты 2, 4 - нет.

Как лучше всего вернуть новый список, содержащий пункты 7, 9 и 2, 4?

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

def difference(list1, list2):
    new_list = []
    for i in list1:
        if i not in list2:
            new_list.append(i)

    for j in list2:
        if j not in list1:
            new_list.append(j)
    return new_list

против

def sym_diff(list1, list2):
    return list(set(list1).symmetric_difference(set(list2)))

Используя время, мы можем видеть результаты

t1 = timeit.Timer("difference(list1, list2)", "from __main__ import difference, 
list1, list2")
t2 = timeit.Timer("sym_diff(list1, list2)", "from __main__ import sym_diff, 
list1, list2")

print('Using two for loops', t1.timeit(number=100000), 'Milliseconds')
print('Using two for loops', t2.timeit(number=100000), 'Milliseconds')

возвращает

[7, 9, 2, 4]
Using two for loops 0.11572412995155901 Milliseconds
Using symmetric_difference 0.11285737506113946 Milliseconds

Process finished with exit code 0
2 голосов
/ 21 апреля 2017

Мы можем вычислить пересечение минус объединение списков:

temp1 = ['One', 'Two', 'Three', 'Four']
temp2 = ['One', 'Two', 'Five']

set(temp1+temp2)-(set(temp1)&set(temp2))

Out: set(['Four', 'Five', 'Three']) 
2 голосов
/ 09 июня 2017

Это можно решить одной строкой. Вопрос задается двумя списками (temp1 и temp2), возвращающими их разницу в третьем списке (temp3).

temp3 = list(set(temp1).difference(set(temp2)))
0 голосов
/ 27 марта 2019
tweets=['manoj', 'shekhar', 'manoj', 'rahul', 'mohit','jyohit','sankar','pappu']
netweets=['manoj','pappu', 'shekhar','mohit','gourav']
netweet = []
for i in tweets:
    if i not in netweets:
        netweet.append(i)
print(netweet)
0 голосов
/ 29 мая 2018

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

>>> from sets import Set
>>>
>>> l1 = ['xvda', False, 'xvdbb', 12, 'xvdbc']
>>> l2 = ['xvda', 'xvdbb', 'xvdbc', 'xvdbd', None]
>>>
>>> Set(l1).symmetric_difference(Set(l2))
Set([False, 'xvdbd', None, 12])

Надеюсь, это поможет.

0 голосов
/ 06 июля 2017
(list(set(a)-set(b))+list(set(b)-set(a)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...