输出列表重复值

时间:2015-07-11 04:40:14

标签: python list recursion

我的函数same_num获取两个排序列表共有的值,并将它们附加到' result'。它使用递归和两个偏移,pos1和pos2,它们总是初始设置为0,以比较列表中的值。运行该函数时,它第一次正常工作,但是如果我第二次运行该函数,原始结果将附加我最初运行它时得到的答案。我哪里错了?

result=[]

def same_num(list1,list2,pos1,pos2):
    list1=sorted(list1)
    list2=sorted(list2)

    if pos1==len(list1) or pos2==len(list2):
        return result
    if list1[pos1]==list2[pos2]:
        result.append(list1[pos1])
        return same_num(list1,list2,pos1+1,pos2+1)    
    if list1[pos1]>list2[pos2]:
        return same_num(list1,list2,pos1,pos2+1)
    if list1[pos1]<list2[pos2]:
        return same_num(list1,list2,pos1+1,pos2)

例如:

same_num([3,1,2,4],[3,1,2,4,5,6],0,0)=>[1,2,3,4]

在shell中重新运行上一个示例会产生:

same_num([3,1,2,4],[3,1,2,4,5,6],0,0)=>[1, 2, 3, 4, 1, 2, 3, 4]

什么时候还应该产生:

[1,2,3,4]

2 个答案:

答案 0 :(得分:2)

问题是result是一个全局变量。 Globals are bad!您正在向resultresult.append(...))添加内容,但在第一次调用same_num函数后从未将其清除。

(虽然我可以理解为什么你采用这种方法,因为从概念上讲,使用全局变量处理递归函数通常更容易。)

如果使result same_num函数的参数可以传递给同一函数的递归调用...这个问题是固定的。

def same_num(list1,list2,pos1,pos2,init_result=None):
    # IMPORTANT: see remark below on why init_result=[]
    # would not do what you expect
    result = init_result if init_result is not None else []

    list1=sorted(list1)
    list2=sorted(list2)

    if pos1==len(list1) or pos2==len(list2):
        return result
    if list1[pos1]==list2[pos2]:
        result.append(list1[pos1])
        return same_num(list1,list2,pos1+1,pos2+1,result)    
    if list1[pos1]>list2[pos2]:
        return same_num(list1,list2,pos1,pos2+1,result)
    if list1[pos1]<list2[pos2]:
        return same_num(list1,list2,pos1+1,pos2,result)

# multiple invocations will return the same (expected) result
print( same_num([3,1,2,4],[3,1,2,4,5,6],0,0) )
print( same_num([3,1,2,4],[3,1,2,4,5,6],0,0) )

顺便提一下,请参阅"Common Python Gotchas: Mutable default arguments",了解我使用init_result=None作为默认值的原因,而不是init_result=[]

答案 1 :(得分:0)

  

运行该功能时,第一次工作正常,但是如果我   第二次运行该函数,原始结果附加   我最初运行它得到的答案。

这是确切的问题。在再次调用之前,您不会清空之前的resultresult仍然包含第一次运行函数时的值。

例如,尝试运行它:

output = same_num([3,1,2,4],[3,1,2,4,5,6],0,0)
print output
result = []
output = same_num([3,1,2,4],[3,1,2,4,5,6],0,0)
print output

两个输出都是[1,2,3,4]