while循环遍历两个列表只迭代一次

时间:2017-08-31 21:55:30

标签: python while-loop

我有一个函数应该将两个已排序的列表合并到一个组合的排序列表中。我知道还有其他方法可以实现这一点,但有人可以解释为什么这段代码不起作用

def merge_two(list1,list2):
    new=[]
    l1=list1[:]
    l2=list2[:]
    while l1 and l2:
        if l1[0]<l2[0]:
            new.append(l1.pop(0))
        else:
            new.append(l2.pop(0))
        print(new,l1,l2)    
        return new+l1+l2

由于某种原因,while循环似乎只运行一次。例如,如果我使用list=['a','x','z']list2=['b','c','f','g'],则函数末尾的打印行会生成['a']['x','z']['b','c','f','g']

从调试开始,这似乎是由于while循环仅执行一次,但我不确定为什么会发生这种情况......它应该一直持续到l1或{{1是空的

1 个答案:

答案 0 :(得分:1)

这是因为函数在返回某些内容后会中断。你需要取消缩进你的return语句:

def merge_two(list1,list2):
    new=[]
    l1=list1[:]
    l2=list2[:]
    while l1 and l2:
        if l1[0]<l2[0]:
            new.append(l1.pop(0))
        else:
            new.append(l2.pop(0))   
    return new+l1+l2

或者,如果由于某种原因您想要列出您的函数生成的所有步骤,您实际上可以使用yield而不是return在您使用返回的完全相同的位置:< / p>

def merge_two(list1,list2):
    new=[]
    l1=list1[:]
    l2=list2[:]
    while l1 and l2:
        if l1[0]<l2[0]:
            new.append(l1.pop(0))
        else:
            new.append(l2.pop(0))   
        yield new+l1+l2

然后运行它:

>>> list(merge_two(a, b))
[['a', 'x', 'z', 'b', 'c', 'f', 'g'],
 ['a', 'b', 'x', 'z', 'c', 'f', 'g'],
 ['a', 'b', 'c', 'x', 'z', 'f', 'g'],
 ['a', 'b', 'c', 'f', 'x', 'z', 'g'],
 ['a', 'b', 'c', 'f', 'g', 'x', 'z']]

当然,您会看到最后生成的列表是排序列表:)。