2012-04-02 4 views

ответ

12

Вы не должны изменять список, который вы выполняете, это приводит к неожиданному поведению (поскольку итератор использует индексы внутри, а те, которые изменяются, удаляются элементами). Что вы можете сделать, это перебрать копию из listA:

for i in listA[:]: 
    if i >= 2: 
    listB.append(i) 
    listA.remove(i) 

Пример:

>>> listA = [1,2,3] 
>>> listB = [] 
>>> for i in listA[:]: 
... if i >= 2: 
...  listB.append(i) 
...  listA.remove(i) 
... 
>>> listA 
[1] 
>>> listB 
[2, 3] 

Однако, это часто намного чище идти функциональный путь, а не изменять исходный список на всех , вместо этого просто создайте новый список со значениями, которые вам нужны. Вы можете использовать списочные, чтобы сделать это элегантно:

>>> lst = [1,2,3] 
>>> small = [a for a in lst if a < 2] 
>>> big = [a for a in lst if a >= 2] 
>>> small 
[1] 
>>> big 
[2, 3] 
+0

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

+0

@Karl: Я просто добавил понимание списка, чтобы сделать именно это. –

+0

@NiklasB. Понимание списка было именно тем, что я закончил делать, но я не был уверен, почему у меня возникла проблема изначально. – devinpleuler

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