2013-01-10 3 views
1

У меня есть класс с именем Info, где информация имеет переменную экземпляра типа строка, которая может получить доступ Info.getName()Удалить элемент в списке с условием

Также у меня есть список экземпляров информации, таких как class_list = [Info('Aleck'), Info('John')].

0: name_list = ['Aleck', 'Bob'], Я хотел бы удалить элемент в class_list с тем же именем в name_list, в то время как мне также нужно знать, нет ли имени (например, Bob) в class_list (например, распечатать, что bob нет в списке)

для примера выше результат должен быть class_list = [Info ('John')] и распечатать, что боб в списке нет.

Я знаю уродливый способ сделать это, например, следующие коды (я на самом деле не запускаю его, просто пример), есть ли элегантный или Pythonic способ сделать это?

def removeElement(name_list, class_list): 
    list_to_be_removed = [] 
    for name in name_list: 
     is_name_in_list = false 
     for obj in class_list 
      if name == obj.getName(): 
       list_to_be_removed.add(obj) 
       is_name_in_list = true 
       break 
     if is_name_in_list == false: 
      print name + ' is not in the list' 
     is_name_in_list = false 

    for obj in list_to_be_removed: 
     class_list.remove(obj) 
+1

Я думаю, что вы вводите в заблуждение классы с примерами. – Kugel

+2

Кроме того, 'class' является ключевым словом, поэтому куча этого кода не будет запущена. – Blckknght

+0

Извините, что я не заметил, что я использовал зарезервированное слово «класс», измененное. – user1817188

ответ

4

Смысл списка - ваш друг.

def remove_names(names_to_remove, info_list): 
    return [info 
      for info in info_list 
      if info.getName() not in names_to_remove] 

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

4

У вас нет классов, у вас есть экземпляры классов. Info('Alice') - вызов конструктора, который создает экземпляр вашего класса Info.

Как об этом:

filtered = [info for info in info_list if info.get_name() not in name_list] 

В качестве альтернативы:

filtered = filter(lambda o: o not in name_list, info_list) 

Если у вас есть много имен конвертировать NAME_LIST в набор и использовать.

name_set = set(name_list) 
+0

Я получил ваше мнение, спасибо большое. На вашем пути я могу отфильтровать список. Тогда у меня должен быть еще один код, чтобы получить имя в name_list, которое НЕ удаляет что-либо в info_list. Большое спасибо. – user1817188

Смежные вопросы