检查item是否是对象列表的成员

时间:2015-06-07 14:25:06

标签: python

我正在寻找一种干净的方法来检查某个项目是否是对象列表的成员。 基本上这就是我想要做的事情:

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'

但我想确定没有比这更好的解决方案了。

3 个答案:

答案 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)常数时间操作。找到匹配后,循环会提前退出,从而进一步减少测试次数。