Предполагая, что элементы в каждом списке уникальны, я хочу создать третий список с элементами из первого списка, которых нет во втором списке:
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 notin 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 notin temp2]