我正在寻找一种干净的方法来检查某个项目是否是对象列表的成员。 基本上这就是我想要做的事情:
class Constant:
def __init__(self,name,value):
self.name = name
self.value = value
list = [Constant('el1',1),Constant('el2',2)]
list2= ['el4','el5','el1']
for item in list2:
#clean solution for this if clause is needed (I'm aware list.name triggers an error)
if item in list.name:
print 'it is a member'
因此,对我来说,项目只与名称匹配很重要,搜索时该值没有意义。我知道我可以通过添加一个额外的for循环来解决这个问题:
for item in list2:
for itemConstant in list:
if item == itemConstant.name:
print 'it is a member'
但我想确定没有比这更好的解决方案了。
答案 0 :(得分:3)
您可以使用any
:
for item in list2:
if any(item == c.name for c in list):
print 'it is a member'
答案 1 :(得分:1)
由于值没有意义使用带in
的集合,因为字符串是可清除的,并且您将有0(1)
个查找,将实例中的名称存储在集合中:
st = {Constant('el1',1).name,Constant('el2',2).name}
lst2 = ['el4','el5','el1']
for c in lst2:
if c in st:
print('it is a member')
或者让lst2成套:
lst = [Constant('el1',1), Constant('el2',2)]
st = {'el4','el5','el1'}
for c in lst:
if c.name in st:
print(c.name)
我认为您需要完全匹配,因为"foo" in "foobar"
将为True。
您也可以将原始列表保留为从实例名称创建一个集合:
lst = [Constant('el1', 1), Constant('el2', 2)]
lst2 = ['el4', 'el5', 'el1']
st = {c.name for c in lst}
for c in lst2:
if c in st:
print('it is a member')
所以你仍然有一个0(n)解决方案,因为它只需要再次传递你的实例。
答案 2 :(得分:0)
使list2
成为集并循环遍历常量列表,以针对该集测试每个常量。找到匹配项后,使用any()
callable提前退出:
constants = [Constant('el1', 1), Constant('el2',2)]
elements = {'el4', 'el5', 'el1'}
if any(c.name in elements for c in constants):
print 'is a member'
这可以将问题减少到一个循环;针对集合的成员资格测试平均是O(1)常数时间操作。找到匹配后,循环会提前退出,从而进一步减少测试次数。