Вопрос-Ответ

Get difference between two lists with Unique Entries

Получить разницу между двумя списками с уникальными записями

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

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

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

temp3 = ['Three', 'Four']

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

Переведено автоматически
Ответ 1

Чтобы получить элементы, которые есть в temp1, но не в temp2 (предполагая уникальность элементов в каждом списке):

In [5]: list(set(temp1) - set(temp2))
Out[5]: ['Four', 'Three']

Помните, что это асимметрично :

In [5]: set([1, 2]) - set([2, 3])
Out[5]: set([1])

где вы могли бы ожидать / хотеть, чтобы оно было равным set([1, 3]). Если вы действительно хотите set([1, 3]) в качестве ответа вы можете использовать set([1, 2]).symmetric_difference(set([2, 3])).

Ответ 2

Все существующие решения предлагают либо одно, либо другое из:


  • Быстрее, чем O (n * m) производительность.

  • Сохранить порядок ввода списка.

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

s = set(temp2)
temp3 = [x for x in temp1 if x not in s]

Тест производительности

import timeit
init = 'temp1 = list(range(100)); temp2 = [i * 2 for i in range(50)]'
print timeit.timeit('list(set(temp1) - set(temp2))', init, number = 100000)
print timeit.timeit('s = set(temp2);[x for x in temp1 if x not in s]', init, number = 100000)
print timeit.timeit('[item for item in temp1 if item not in temp2]', init, number = 100000)

Результаты:

4.34620224079 # ars' answer
4.2770634955 # This answer
30.7715615392 # matt b's answer

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

init = '''
temp1 = [str(i) for i in range(100000)]
temp2 = [str(i * 2) for i in range(50)]
'''

Результаты:

11.3836875916 # ars' answer
3.63890368748 # this answer (3 times faster!)
37.7445402279 # matt b's answer
Ответ 3

Это можно сделать с помощью python XOR operator.


  • Это удалит дубликаты в каждом списке

  • Это покажет разницу temp1 от temp2 и temp2 от temp1.


set(temp1) ^ set(temp2)
Ответ 4

Вы могли бы использовать понимание списка:

temp3 = [item for item in temp1 if item not in temp2]
2023-08-19 13:33 python performance list