例如:
class someObject:
def __init__():
pass
objone = someObject()
listone = []
listone.append(objone)
objtwo = someObject()
listtwo = []
listtwo.append(objtwo)
两个列表都有相同类型的对象,即someObject,我想知道如何检查它。上面的场景应该返回True,因为两个列表都有相同类型的对象,但如果listone是空的,或者说,有一个字符串和对象,它将返回False。
check_lists
函数执行以下操作,它首先检查列表或相同长度的,然后通过列表中的元素zips
,并比较i
的type
是否与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.chain
、all
和isinstance
。
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)):
...