2016-04-02 12 views
0

У меня есть этот код:Как я могу перебирать список строк?

test = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O"] 

for i in test: 
    if i not in ["C","D"]: 
     test.remove(i) 

print(test) 

Я ожидал получить ['C','D'] в результате выполнения кода выше, однако я получаю эту ['B', 'C', 'D', 'F', 'H', 'J', 'L', 'N']

Как я могу успешно перебрать список строк и удалить элементы, которые мне не нужны, используя Python 3?

Примечание: Я не хочу, чтобы использовать понимание списков

благодаря

+5

Возможный дубликат [Удалить элементы из списка при повторении в Python] (http://stackoverflow.com/questions/1207406/remove-items-from-a-list-while -iterating-in-python) – soon

+0

@soon Я не хочу использовать списки понимания. спасибо –

+0

Любые причины не использовать списки? – soon

ответ

3

При удалении из списков на других языках, я использовал обратный ходить список:

test = ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O"] 

for i in reversed(test): 
    if i not in ["C","D"]: 
     test.remove(i) 

print(test) 

Примечание что reversed создаст новый список, поэтому это может быть не лучшее решение для больших списков. Теперь, так как вы уже ходить копию списка, и если вам нужно разобрать в правильном порядке, вы можете использовать copy:

import copy 
for i in copy.copy(test): 
    if i not in ["C","D"]: 
     test.remove(i) 

и избежать импорта (из here):

for i in test[:]: 
    if i not in ["C","D"]: 
     test.remove(i) 

Наконец, самое лучшее решение для меня, является традиционным, на месте обратной итерации без копирования списка («заимствованный» и измененную из this ответа)

for i in range(len(test) - 1, -1, -1): 
    if test[i] not in ["C","D"]: 
     del test[i] 
+0

Большое спасибо за это, это гораздо эффективнее, чем использование списка comprehesion? –

0

Первый цикл: i = 'A', i не в ['C', 'D'] -> удалить i. Теперь первым элементом test является «B». Поэтому в следующем цикле i будет равен 'C'. Вот почему все пошло не так ...

+0

Я знаю это, но это поведение, похоже, не возникает, когда я использую список int. –

+0

Это произойдет независимо от того, какой список. Вы можете использовать pdb для отладки и проверки самостоятельно: ') –

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