将数组元素分成两个数组

时间:2017-03-07 03:23:15

标签: python

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

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]

怎么回事?我怎么解决这个问题?

6 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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)

答案 2 :(得分:0)

修改list mid-iteration导致错误行为(您实际上跳过了输入元素)。不要removeV {长V费用昂贵,remove O(n) O(n**2)总工作V V ),只保留O(n)未经修改。如有必要,请在完成后清除del V[:] (单public class Rootobject { public Class1[] Property1 { get; set; } } public class Class1 { public Mountain[] Mountains { get; set; } } public class Mountain { public string MtName { get; set; } public int Masl { get; set; } public int Difficulty { get; set; } public int Island { get; set; } } 次操作),例如循环之后:

Mountains

答案 3 :(得分: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)

答案 4 :(得分: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]

答案 5 :(得分: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]