如何以递归方式比较python中的2个列表(未排序,与顺序无关)

时间:2018-10-16 01:17:16

标签: python list recursion compare

我的最后一个问题是能够准确比较两个没有相同元素的相同大小的列表。除了列表方法len,del,index外,我不能使用任何内置的Python函数(即sort,compare,Counter)。

我的代码:

def SameStuff(l1, l2):
    if len(l1) <= 1 or len(l2) <= 1 or len(l1) != len(l2):
        if len(l1) == 0 or len(l2) == 0:   
            return len(l1) == len(l2)
        else:                    
            return len(l1) == len(l2) and l1[0] == l2[0]     
    else:
        if l1[0] == l2[0]:                                          
            return SameStuff(l1[1:], l2[1:])                 
        else:
            return SameStuff(l1, l2[1:]+[l2[0]]) 

3 个答案:

答案 0 :(得分:0)

    def SameStuff(l1, l2):
        if l1 == []: return l2 == []
        if len(l1) != len(l2): return False
        else: return SameStuff(l1[1:], [x for x in l2 if x != l1[0]])

这可以独立工作。

以下版本还允许重复列表中的元素。

def SameStuff(l1, l2):
    if l1 == []: return l2 == []    
    elif len(l1) != len(l2): return False  
    elif l1[0] in l2: 
        i = l2.index(l1[0]) 
        return SameStuff(l1[1:], l2[:i] + l2[i+1:]) 
    else: return False

答案 1 :(得分:0)

您的解释令人困惑:

  

比较两个相同大小且没有共同元素的列表

您如何比较没有共同点的列表?似乎您想比较两个列表以查看它们是否包含相同的元素,但是顺序是否相同。至于仅通过功能/方法len()del()index()来做到这一点,我相信只需index()就可以做到:

def SameStuff(l1, l2):
    if l1 and l2:  # both contain something
        try:
            index = l2.index(l1[0])

            return SameStuff(l1[1:], l2[:index] + l2[1 + index:])  # recurse

        except ValueError:

            return False  # a value in one wasn't found in the other

    return not(l1 or l2)  # only one contains something (False), or neither do (True)

此解决方案也不会破坏其论点。

答案 2 :(得分:0)

比较2个列表而不考虑顺序的最有效方法是使用collections.Counter,因为它的平均时间复杂度仅为O(n),但是由于您无法使用它,因此可以改为实现您自己使用同一主体,使用两个dict来跟踪每个列表中每个不同项目的计数:

def compare(l1, l2, d1=None, d2=None):
    if not d1:
        d1, d2 = {}, {}
    if l1 and l2:
        d1[l1.pop()] = d1.get(l1[-1], 0) + 1
        d2[l2.pop()] = d2.get(l2[-1], 0) + 1
        return compare(l1, l2, d1, d2)
    elif not l1 and not l2:
        return d1 == d2
    return False

这样:

print(compare([2, 3, 5, 3], [3, 5, 2, 3]))
print(compare([2, 3, 5, 2], [3, 5, 2, 3]))
print(compare([2, 3, 5, 2], [3, 5, 2]))

将输出:

True
False
False

请注意,对列表进行切片或使用list.index的任何方法总是效率低下,因为它需要O(n)为列表中的每个项目执行每个操作,从而导致O(n ^ 2 )的总体时间复杂度。