2013-04-29 4 views
0

У нас есть некоторые объекты со свойствамиКак проверить, если объект в списке имеет определенное свойство

class my_object: 
    def __init__(self, type, name): 
     self.type = type 
     self.name = name 

и список, который содержит много объектов с различными type и name значений.

Что мне нужно, это понимание, которое делает что-то вроде:

if my_object.type == 'type 1' in object_list: 
    object_list.remove(all objects with name == 'some_name') 

ответ

1

Я думаю, что вам нужно:

if any(obj.type == 'type 1' for obj in object_list): 
    object_list = [obj for obj in object_list if obj.name != 'some_name'] 
+0

не эффективно ... избавиться от, если ... вы циклически дважды нет причины –

+0

@ JoranBeasley - Что значит? Цикл действительно не так дорого, и фактор другого теста в list-comp изменит логику (хотя, может быть, и немного). – mgilson

+0

ahh да, ваше право .. я думаю, что это так ... Я просто прочитал заявление о проблеме неправильно –

0
if hasattr(my_object,"some_attribute") : doSomething() 

хотя в вашем случае я думаю, что вы хотите

filter(lambda x:not hasattr(x,"name") or x.name != "some_name",my_list_of_objects) 
2

Я думаю, что вы ищете для:

object_list = filter(lambda x: x.name != 'some_name', object_list) 
+0

Я думаю, что это то, что он хочет ... –

+0

Да, я тоже так думаю ... Хотя, я бы посоветовал здесь список-комп. – mgilson

+0

meh ... почему? Я знаю, что фильтр не эффективнее с lambdas ... но для меня то, что вы делаете, это «фильтрация» списка, и поэтому использование фильтра более естественно для меня ... –

0

Вы можете сделать:

def remove_objects(obj_list,*args,**kwargs): 
    for n_count,node in enumerate(obj_list[::]): 
     del_node=False 
     for k,v in kwargs.items(): 
      if hasattr(node,str(k)): 
       if getattr(node,str(k))==v: 
        del_node=True 
        break 
     if del_node: 
      del obj_list[n_count] 

И использовать это нравится:

class HelloWorld(object): 
    lol="haha" 
my_list_of_objects=[HelloWorld for x in range(10)] 
remove_objects(my_list_of_objects,lol="haha") 
+1

не изменяйте список, как вы итерируете его! особенно при переходе от низкого к высокому, но на самом деле даже при переходе с высокой на низкую. –

+1

Ничего себе ... Это выглядит ... Сложно. Кроме того, я не решаюсь сказать, что я считаю, что это работает, потому что вы удаляете объекты из списка, когда вы перебираете его. Наконец, вместо того, чтобы держать счетчик самостоятельно, вы можете использовать встроенный 'перечисление'. – mgilson

+0

исправлены оба вопроса :) –