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

Скажи, у меня есть список:

<code>main_list = ['bacon', 'cheese', 'milk', 'cake', 'tomato']
</code>

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

<code>second_list = ['cheese', 'tomato']
</code>

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

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

Адам

 jamylak12 мая 2012 г., 13:31
Заказ имеет значение?

Ответы на вопрос(4)

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))
 Vikas12 мая 2012 г., 13:30
Мне нравится, как выразительный питон :). Как будто ты говоришь по-английски.
 roskakori12 мая 2012 г., 13:33
Хороший ответ, небольшое дополнение: вы можете оптимизировать вариант сохранения порядка, изменивsecond_array сначала в набор:second_set = set(second_array); new_array = [x for x in main_array if x not in second_set]
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'])
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']
Решение Вопроса

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

>>> 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'])
 ThiefMaster♦12 мая 2012 г., 13:27
Это не сработает, если будет соблюден порядок. В противном случае это действительно лучшее решение. Тем не менее, я думаю, что он хочудалят эти элементы, так что используйте- вместо того&.
 fraxel12 мая 2012 г., 13:38
@ ThiefMaster - правда, и не интерпретировалI want to all elements правильно

Ваш ответ на вопрос