Python 将数组的元素分成两个数组
我编写了一个简单的代码,将数组的元素分成两个新数组:一个是奇数数组,另一个是偶数数组。所以我这样做了:Python 将数组的元素分成两个数组,python,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 identati
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]
这是怎么发生的?如何解决此问题?不要从正在迭代的列表中删除项目。使用副本:
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]
在遍历数组时不应删除项:
V=[1,2,3,4,5,6]
vp=[]
vi=[]
for x in V:
if x%2==0:
vp.append(x)
else:
vi.append(x)
在迭代过程中修改
列表
会导致错误行为(实际上会跳过输入元素)。不要边走边从V
中删除(长期来看V
会很昂贵,每次remove
都是O(n)
使总工作量O(n**2)
),只需保持V
不变即可。如有必要,请在完成(单个O(n)
操作)后清除V
,例如,在循环之后:
del V[:]
从列表中删除项目时,列表会变短。因此,当您正向遍历列表时,删除项将导致迭代器向前跳过
为了缓解这种情况,您可以在列表上向后循环并安全地删除项,因为您正在从末尾删除它们
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)
确定问题和修复的其他答案,但这里有一种不同的方法使用
从原始列表中创建新的奇偶列表的更简洁的方法是使用理解:
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]
准确地说,您的预期/期望输出是什么?您的缩进看起来不错,但您的注释是无效的Python——它应该以#
而不是/
开头。当您使用Python迭代列表时,从该列表中删除一个项目将导致您跳过一个项目。在本例中,您正在迭代V。因此,您最终修改了您的列表,如下所示:V[0]==1v[1]==2v[2]==3v.remove(0)V[0]==2v[1]==3第三个列表也不是必需的,在删除evens之后,剩下的将是补码集:赔率。感谢大家的帮助。
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]