检查对象列表是否包含具有特定属性值的对象。
检查对象列表是否包含具有特定属性值的对象。
我想检查我的对象列表是否包含具有特定属性值的对象。
class Test: def __init__(self, name): self.name = name # 在主函数中 l = [] l.append(Test("t1")) l.append(Test("t2")) l.append(Test("t2"))
我想知道如何检查列表是否包含名称为"t1"
的对象。该怎么做?我在https://stackoverflow.com/a/598415/292291找到了一种方法,
[x for x in myList if x.n == 30] # 所有匹配项的列表 any(x.n == 30 for x in myList) # 是否有任何匹配项 [i for i,x in enumerate(myList) if x.n == 30] # 所有匹配项的索引 def first(iterable, default=None): for item in iterable: return item return default first(x for x in myList if x.n == 30) # 第一个匹配项,如果有的话
我不想每次都遍历整个列表;我只需要知道是否有一种匹配项。是使用first(...)
还是any(...)
或其他方法?
问题出现的原因:在给定的问题中,需要判断一个对象列表中是否包含具有特定属性值的对象。而在现有代码中,并没有直接提供这样的功能。
解决方法:为了解决这个问题,可以使用lambda表达式来创建一个函数,该函数接受一个元素和一个数组作为输入,并返回一个布尔值,指示元素是否存在于数组中。然后可以使用这个函数来判断对象列表中是否存在具有特定属性值的对象。
下面是解决问题的代码:
InArray = lambda elem, arr: bool(any(elem == x for x in arr)) # InArray: Is elem part of arr? def main(): DataType = ctypes.c_byte AllowedTypes = (ctypes.c_byte , ctypes.c_ubyte, ctypes.c_int32, ctypes.c_uint32, ctypes.c_float, ctypes.c_double) if InArray(DataType, AllowedTypes): pass if InArray(DataType, (ctypes.c_double, ctypes.c_float)): pass
通过使用InArray函数,可以判断DataType对象是否存在于AllowedTypes列表中。如果存在的话,可以执行相应的操作。
问题的出现原因是需要在一个对象列表中检查是否存在具有特定属性值的对象。解决方法是使用内置函数next()
来实现。下面是使用next()
函数的两种方法:
方法一:
next((True for x in l if x.name=='t2'), False)
这种方法会在找到满足条件的对象后停止,并返回True
。如果找不到满足条件的对象,则返回False
。
方法二:
next((x for x in l if x.name == 't2'), None)
这种方法会返回满足条件的对象本身。如果找不到满足条件的对象,则返回None
。
通过使用next()
函数,我们可以轻松地检查一个对象列表中是否存在具有特定属性值的对象。