将列表清空到新列表中

时间:2015-04-13 01:28:21

标签: python list

我试图创建一个函数,当列表为空时,第二个列表将以相反的顺序清空为空列表。现在,我试着这样做:

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中的其他所有数字。

5 个答案:

答案 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个元素,所以它会退出。