2012-05-12 3 views
6

Скажем у меня есть список:Python, удалить все вхождения строки в списке

main_list = ['bacon', 'cheese', 'milk', 'cake', 'tomato'] 

и другой список:

second_list = ['cheese', 'tomato'] 

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

Спасибо заранее

Адам

+3

ли заказ дело? – jamylak

ответ

7

Если заказ не имеет значения вы можете использовать sets:

>>> main_array = ['bacon', 'cheese', 'milk', 'cake', 'tomato'] 
>>> second_array = ['cheese', 'tomato'] 
>>> set(main_array) & set(second_array) 
set(['tomato', 'cheese']) 

Здесь мы используем оператор пересечения, &. Если вы хотите только элементов не найден в вашем втором списке, мы можем использовать разницу, -:

>>> set(main_array) - set(second_array) 
set(['cake', 'bacon', 'milk']) 
+0

Это не сработает, если заказ должен быть сохранен. В противном случае это действительно лучшее решение. Однако, я думаю, он хочет * удалить * эти элементы, поэтому используйте '-' вместо' & '. – ThiefMaster

+1

@ThiefMaster - правда, и не интерпретировал «Я хочу всех элементов» правильно! – fraxel

11
new_array = [x for x in main_array if x not in second_array] 

Однако это не очень производительные для больших списков. Вы можете оптимизировать с помощью набора для second_array:

second_array = set(second_array) 
new_array = [x for x in main_array if x not in second_array] 

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

new_array = list(set(main_array) - set(second_array)) 
+0

Мне нравится, как выразительный питон: :). Это похоже на то, что вы говорите по-английски. – Vikas

+2

Хороший ответ, просто небольшое дополнение: вы можете оптимизировать вариант сохранения порядка, сначала изменив 'second_array' на набор: ' second_set = set (second_array); new_array = [x для x в main_array, если x не в second_set] ' – roskakori

2
main_array = set(['bacon', 'cheese', 'milk', 'cake', 'tomato']) 
second_array = (['cheese', 'tomato']) 

main_array.difference(second_array) 
>>> set(['bacon', 'cake', 'milk']) 

main_array.intersection(second_array) 
>>> set(['cheese', 'tomato']) 
0
l = [u'SQOOP', u'SOLR', u'SLIDER', u'SFTP', u'PIG', u'NODEMANAGER', u'JSQSH', u'HCAT', u'HBASE_REGIONSERVER', u'GANGLIA_MONITOR', u'FLUME_HANDLER', u'DATANODE', u'BIGSQL_WORKER'] 

p = [u'SQOOP', u'SOLR', u'SLIDER', u'SFTP'] 

l = [i for i in l if i not in [j for j in p]] 

print l 
[u'PIG', u'NODEMANAGER', u'JSQSH', u'HCAT', u'HBASE_REGIONSERVER', u'GANGLIA_MONITOR', u'FLUME_HANDLER', u'DATANODE', u'BIGSQL_WORKER'] 
Смежные вопросы