2015-11-13 3 views
1

Я использую python, чтобы попытаться удалить элементы, которые пересекаются из другого списка. Итак, вот что я имею.Python удаляет элементы из списка, которые существуют в другом списке, но сохраняя дубликаты, которые не находятся в этом пересечении.

letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ] 
cons = ['b','c','d', 'f', 'g'] 

, и я хочу удалить любую букву из списка писем из списка букв, но сохранить все остальное. Итак, вот что я хочу получить.

letter = ['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', i', 'i' ] 

Ниже приведено то, что я пробовал до сих пор, но он не работает.

for i in letter[:]: 
    if i in cons: 
     letter.remove(i) 
     cons.remove(i) 

и ...

list(set(x) - set(y)) 

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

ответ

7
>>> letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ] 
>>> cons = ['b','c','d', 'f', 'g'] 

>>> [x for x in letter if x not in cons] 
['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', 'i', 'i'] 

Простой способ определения списка сделает трюк?

EDIT:

Как сказал ShadowRanger, это улучшит производительность (в основном для больших наборов данных, чем это), чтобы преобразовать недостатки в комплекте:

cons = set(cons) 

затем, чтобы войти в список компе. Это лучше, потому что sets хэшируются и позволяет получать детали/проверки элементов в ней путь быстрее

+1

И для повышения эффективности , это, вероятно, поможет хранить 'cons' как' set'/'frozenset' (или если он короткий, как простая строка, которая по-прежнему является временем линейного сканирования, но быстрее для теста на членство для отдельных символов, чем' list' одиночных символьных строк). – ShadowRanger

+0

true, я действительно не беспокоился об эффективности в этом, но это сделало бы огромный импульс. отредактировано, чтобы добавить это –

2

список понимание лучше, но ваш исходный код работает, если мы просто удалить одну строку:

>>> letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ] 
>>> cons = ['b','c','d', 'f', 'g'] 
>>> for i in letter[:]: 
...  if i in cons: 
...   letter.remove(i) 
... 
>>> letter 
['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', 'i', 'i'] 
Смежные вопросы