我试图创建一个函数,当列表为空时,第二个列表将以相反的顺序清空为空列表。现在,我试着这样做:
a = [1,2,3,4]
b = []
def a_to_b(a, b):
if not a:
print('a:',a)
print('b:',b)
for c in b:
a.append(c)
b.remove(c)
print('a:',a)
print('b:',b)
return True
else:
top = a.pop()
b.append(top)
print('a:',a)
print('b:',b)
return True
我希望它在每次运行后都是:
1) a = [1,2,3]
b = [4]
2) a = [1,2]
b = [4,3]
3) a = [1]
b = [4,3,2]
4) a = []
b = [4,3,2,1]
5) a = [1,2,3,4]
b = []
但是在第五次运行之后它给了我
a = [4,2]
b = [3,1]
我无法弄清楚为什么它只适用于b中的其他所有数字。
答案 0 :(得分:2)
这应该有效
a = [1,2,3,4]
b = []
for i in range(len(a)):
b.append(a[-1])
a.pop()
print a,b
a = [1,2,3,4]
b = []
for i in range(len(a)):
b.append(a[-1])
a.pop()
print a,b
答案 1 :(得分:1)
您的问题是由您删除在for循环中跳过的元素造成的。
指针作为索引0,1,2,3,但你已经删除了第0个元素,导致指针直接转到2(现在是剩余列表中的索引1)
要避免它,您可以将代码更改为:
for c in b:
a.append(c)
for c in a:
b.remove(c)
答案 2 :(得分:1)
以下是您获得奇怪结果的原因:
for c in b:
a.append(c)
b.remove(c)
您正在重复更改列表b,因为您正在迭代它。因此,事情不会像你期望的那样出现。为什么不做你
b.reverse()
a = b
b = []
取代之前的地方。所以它就是
a = [1,2,3,4]
b = []
def a_to_b(a, b):
if not a:
print('a:',a)
print('b:',b)
b.reverse()
a = b
b = []
print('a:',a)
print('b:',b)
return True
else:
top = a.pop()
b.append(top)
print('a:',a)
print('b:',b)
return True
答案 3 :(得分:1)
def f(a, b):
if a:
b.append(a.pop())
else:
while b:
a.append(b.pop())
print 'a: %s' % a
print 'b: %s' % b
>>> a = [1, 2, 3, 4]
>>> b = []
>>> f(a, b)
a: [1, 2, 3]
b: [4]
>>> f(a, b)
a: [1, 2]
b: [4, 3]
>>> f(a, b)
a: [1]
b: [4, 3, 2]
>>> f(a, b)
a: []
b: [4, 3, 2, 1]
>>> f(a, b)
a: [1, 2, 3, 4]
b: []
答案 4 :(得分:0)
问题在于:
for c in b:
a.append(c)
b.remove(c)
你不能从一个可互换的中间删除对象而不会混淆循环。
接下来会发生什么:
您有b=[4,3,2,1]
和a=[]
。您启动for循环,c
指向b的第一个索引,即4.您从列表中删除c
并将其放入a
。
现在你有b = [3,2,1]
和a=[4]
,就像你期望的那样。
当你尝试启动下一个循环时,你的索引会递增(c
现在指向第二个元素),但问题是你已经搞乱了迭代的结构。所以循环删除c
就像它应该的那样,但是c=2
,而不是像你期望的那样3。
现在你有a=[4,2]
和b=[1,3]
,当循环检查索引3时,它发现b
只有2个元素,所以它会退出。