在Python中,有没有一种方法可以检查两个对象列表是否只包含相同类型的对象



例如:

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

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

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((

>>> 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

使用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)):
...

相关内容

  • 没有找到相关文章

最新更新