2017-03-07 48 views
0

我做了一个简单的代码来将一个数组的元素分成两个新的数组:一个是奇数,另一个是偶数。所以我这样做:把数组分成两个数组

V=[1,2,3,4,5,6] 
vp=[] 
vi=[] 
for x in V: 
    if x%2==0: 
     vp.append(x) 
     V.remove(x) 
    else: 
     vi.append(x) 
     V.remove(x) 

print (V) 
print (vp) 
print (vi) # sorry for the bad identation first time sharing code here 

这个代码给我这样的结果:

[2,4,6] 
[] 
[1,3,5] 

它是如何发生的呢?我如何解决这个问题?

+2

什么是你的预期/所需的输出,精确? – ShadowRanger

+0

您的缩进看起来很好,但您的评论无效Py​​thon - 它应该以'#'而不是'//'开头。 – KernelPanic

+3

当您使用python遍历列表时,从列表中删除项目会导致您跳过一个项目。 在所以,你最终修改的列表,像这样这种情况下,你是通过迭代五: V [0] == 1 V [1] == 2 V [2] == 3 V.remove (0) V [0] == 2 V [1] == 3 – SuperTetelman

回答

0

不要从正在迭代的列表中删除项目。使用副本:

V=[1,2,3,4,5,6] 
vp=[] 
vi=[] 
for x in V[:]: 
    if x%2==0: 
     vp.append(x) 
     V.remove(x) 
    else: 
     vi.append(x) 
     V.remove(x) 

print (V) 
print (vp) 
print (vi) 
# [] 
# [2, 4, 6] 
# [1, 3, 5] 
+2

第三个列表也不是必需的,除去余数后剩下的就是补集:赔率。 – karakfa

+0

感谢您的帮助。 –

0

在遍历数组,您不应该删除项目:

V=[1,2,3,4,5,6] 
vp=[] 
vi=[] 
for x in V: 
if x%2==0: 
    vp.append(x) 
else: 
    vi.append(x) 
0

修改list中旬迭代导致的不当行为(你有效地跳过输入元素)。不要removeV当你去(其中长期V将是昂贵的,每个removeO(n)使总工作O(n**2)),只是留下V未修改。如有必要,请在完成后单击V(单个O(n)操作),例如循环后:

del V[:] 
0

当您从列表中删除项目时,列表变短。所以当你在一个正向循环列表时,删除项目会导致迭代器跳过前进。

为了缓解这种情况,您可以在列表中向后循环并安全地移除项目,因为您将其从最后移除。

V = [1,2,3,4,5,6] 
vp = [] 
vi = [] 

# reverse the list before iterating 
for x in reversed(V): 
    if x % 2 == 0: 
     vp.append(x) 
     V.remove(x) 
    else: 
     vi.append(x) 
     V.remove(x) 
0

该发现的问题和修复,但在这里,其他的答案是不同的方式使用list comprehensions做到这一点。

numbers = [1,2,3,4,5,6] 
even = [e for e in numbers if e % 2 == 0] 
odd = [e for e in numbers if e % 2 == 1] 
0

一个更简洁的方式从原来作出新的奇数和偶数列表是使用内涵:

v = [1,2,3,4,5,6] 
even = [number for number in v if number % 2 == 0] 
odd = [number for number in v if number % 2 != 0]