比较 Python 中的两个未知列表



如何使用未知数量的子列表和未知元素遍历两个未知列表。我要做的是比较它们并返回True如果它们的长度相同,False如果长度不同且特定索引中的元素类型不同。

到目前为止我的代码:

def similarList(list1,list2):
    if len(list1)!=len(list2):
        return False
    else:
        if len(list1)>1 and len(list2)>1:

这是我不确定如何比较list1list2的每个元素的地方。

例:

similarList([0],[4])

similarList([3.9],[8])

similarList([[4,5,6],4] , [[2,3,4],'a'])

为 False,因为4是整数,'a'是字符串。

我可能会做这样的事情:

def similarList(list1, list2):
    if len(list1) != len(list2):
        return False
    return all(isinstance(a, type(b)) for a, b in zip(list1, list2))

isinstance(a, type(b))位可能会根据您的用例进行一些调整。 例如,如果你想断言它们是完全相同的类型,type(a) is type(b)会更合适。 如果您不知道哪个是子类,那么isinstance(a, type(b)) or isinstance(b, type(a))可能是您想要的。

仅供参考:"同一类型"标准存在一定程度的歧义 - 例如考虑'foo'u'foo'。 它们不是同一类型。 它们甚至不会通过我上面概述的最宽松的isinstance检查,但对于许多应用程序,它们是可以互换的。

您可以使用type和递归在lists中再次检查:

def similarList(list1,list2):
    if len(list1)!=len(list2):
       return False
    else:
        for item1, item2 in zip(list1, list2):
            if type(item1) != type(item2):
                return False
            elif isinstance((item1, item2), list):
               return similarList(item1,item2)
    return True

如果您只处理列表(而不是元组),并且您希望严格进行类型比较,这应该有效:

def similar_list(list1, list2):
    if not isinstance(list1, list) or not isinstance(list2, list):
        return False
    if len(list1) != len(list2):
        return False
    for a, b in zip(list1, list2):
        if isinstance(a, list):
            if not similar_list(a, b):
                return False
        if type(a) is not type(b):
            return False
    return True

最新更新