2013-08-21 3 views
0

Это мой код:Список Снимать в двойной петле

csvFile = [a,b,c,d,e,...] 
brandList = [a,c,e,...] 
copyFile = csvFile 

for i in csvFile: 
    for j in List2: 
     if ' '+j.lower()+' ' in ' '+i.lower()+' ': 
      print j.lower(), ' ',i.lower() 
      copyFile.remove(i) 

Однако после удаления элемента, процесс пропускает один элемент. Таким образом, в списке [a, b, c, d, e] удаление c будет полностью пропускать d (также печать). Имейте в виду, что я не удаляю из списка, который я использую для цикла. Я тоже попробовал перерыв. Если вы удалите «линию удаления», печать даст мне правильный результат.

+2

не мутировать (например: 'remove') элементы списка вы Перебор. Имя 'csvFile' вводит в заблуждение, так как это список. Что именно ты пытаешься сделать? –

+0

В частности 'csvFile' и' copyFile' являются двумя ссылками на один и тот же список. Могу ли я предложить вам инициализировать позже как 'copyFile = list (csvFile)'. –

+0

@SethMMorton: Существует 'in', а не' == 'оператор. Это совпадение всего слова бедного человека. –

ответ

3

Да, вы : удалить из списка, который вы используете, чтобы цитировать. Потому что copyFile и csvFile указывают на тот же объект списка. Python имеет чисто ссылочную семантику, поэтому назначение делает новую переменную точкой для того же объекта, что и выражение правой руки, а не глубокая копия.

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

copyFile = list(csvFile) 
+0

или '' copyFile = csvFile [:] '' –

+0

@FelixYan: Я нахожу 'list()' более читаемым в этом случае. –

+1

list() также влияет на то, что если исходный ввод является итерируемым, отличным от списка, он преобразует тип в список, тогда как [:] оставит тип один, поэтому, если вход является кортежем, Получаем ошибку при попытке изменить кортеж, если вы используете [:]. С другой стороны [:] по спецификации возвращает неглубокую копию оригинала, поэтому, если вам нужна копия без преобразования типа в список, используйте [:]. Также обратите внимание, что, хотя list (listA) возвращает копию списка, tuple (tupleA) возвращает исходный итеративный, если он уже является кортежем. – Perkins

1

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

import re 

base_items = ['a', 'b', 'c', 'the quick letter a jumped over the dog', 'eeeeee I no match...'] 
look_for = ['a', 'c', 'e'] 
rx = re.compile(r'\b({})\b'.format('|'.join(re.escape(item) for item in sorted(look_for, key=len, reverse=True)))) 
res = filter(rx.search, base_items) 
# ['a', 'c', 'the quick letter a jumped over the dog'] 
+0

Похоже, это гораздо более эффективное решение. Однако это может быть несколько продвинутым для новичков. –

Смежные вопросы