在Python中,有没有办法检查两个对象列表是否只包含相同类型的对象?

2024-05-16 02:37:31 发布

您现在位置:Python中文网/ 问答频道 /正文

例如:

class someObject:
    def __init__():
        pass
objone = someObject()
listone = []
listone.append(objone)
objtwo = someObject()
listtwo = []
listtwo.append(objtwo)

两个列表都有相同类型的对象,即someObject,我想知道如何检查它。上面的场景应该返回True,因为两个列表都有相同类型的对象,但是如果listone是空的,或者,比方说,有一个字符串对象,它将返回False


Tags: 对象true类型列表initdef场景pass
3条回答

使用itertools.chainallisinstance

from itertools import chain

if all(isinstance(x, someObject) for x in chain(listone, listtwo)):
    ...

如果您事先不知道涉及哪种类型,只需获取第一个对象(在验证两个列表是否为非空后):

if listone and listtwo and all(isinstance(x, type(listone[0])) for x in chain(listone, listtwo)):
    ...

check_lists函数执行以下操作,它首先检查列表是否具有相同的长度,然后通过列表中的元素zips,并比较itype是否与j相同。只有当所有的都是True时,你才能得到True否则False

下面的示例显示了一些测试

class someObject:
    def __init__(self):
        pass
objone = someObject()
listone = []
listone.append(objone)
objtwo = someObject()
listtwo = []
listtwo.append(objtwo)

def check_lists(listone, listtwo):
    return len(listone) == len(listtwo) and all(isinstance(i, someObject) and isinstance(j, someObject) for i, j in zip(listone, listtwo))

print(check_lists(listone, listtwo)) # True
listtwo.append('string')
print(check_lists(listone, listtwo)) # False

编辑: 将is更改为and@切普纳的评论解释了这一点

使用类型()

>>> type(objone) == type(objtwo)
True
>>> type(objone) == type("some String")
False

# here is how

>>> list_one_types = [type(i) for i in listone]
>>> list_two_types = [type(i) for i in listtwo]
>>> list_one_types = set(list_one_types)
>>> list_two_types = set(list_two_types)
>>> list_one_types
{<class '__main__.someObject'>}
>>> list_two_types
{<class '__main__.someObject'>, <class 'str'>}
>>> list_one_types == list_two_types
False

相关问题 更多 >