Python 将列表清空为新列表

Python 将列表清空为新列表,python,list,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)

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

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中的每一个其他数字。

您的问题是由于删除了for循环中跳过的元素造成的

指针将作为索引0、1、2、3运行,但您已经删除了第0个元素,导致指针直接运行到2,而2现在是剩余列表中的索引1

为了避免这种情况,您可以将代码更改为:

for c in b:
    a.append(c)
for c in a:
    b.remove(c)

您的问题是由于删除了在for循环中跳过的元素造成的

指针将作为索引0、1、2、3运行,但您已经删除了第0个元素,导致指针直接运行到2,而2现在是剩余列表中的索引1

为了避免这种情况,您可以将代码更改为:

for c in b:
    a.append(c)
for c in a:
    b.remove(c)

以下是您得到奇怪结果的原因:

    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

以下是您得到奇怪结果的原因:

    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
问题在于:

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指向第二个元素,但问题是你弄乱了iterable的结构。因此,循环会像预期的那样移除c,但是c=2,而不是像预期的那样移除3

现在有了a=[4,2]和b=[1,3],当循环检查索引3时,它发现b is只有2个元素,因此它退出。

问题在于:

for c in b:
        a.append(c)
        b.remove(c)
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: []
在不混淆循环的情况下,无法从交互对象的中间删除对象

发生的情况如下:

有b=[4,3,2,1]和a=[]。启动for循环,c指向b的第一个索引,即4。从列表中删除c,然后将其放入a中

现在你有了b=[3,2,1]和a=[4],就像你期望的那样

当你尝试开始下一个循环时,你的索引是递增的,现在c指向第二个元素,但问题是你弄乱了iterable的结构。因此,循环会像预期的那样移除c,但是c=2,而不是像预期的那样移除3

现在你有了a=[4,2]和b=[1,3],当循环检查索引3时,它发现b is只有2个元素,所以它退出。

这应该是可行的
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: []

这应该行得通


这是家庭作业问题吗?因为在python中有比你现在做的更简单的方法不,这不是,只是我在做的一个个人项目。有什么更简单的方法?这是家庭作业问题吗?因为在python中有比你现在做的更简单的方法不,这不是,只是我在做的一个个人项目。有什么更简单的方法吗?如果你在这里。。。虽然b-不需要检查它们的长度,但是如果a在这里,你可以使用它。。。而b-不需要检查它们的长度你可以做b.appenda.pop你可以做b.appenda.pop