2013-01-10 32 views
1

刪除元件我有一個名爲信息類,其中信息具有可通過Info.getName()列表中的與條件

訪問的字符串型實例變量另外我有實例的信息的列表,諸如class_list = [Info('Aleck'), Info('John')]

給定一個name_list = ['Aleck', 'Bob'],我想刪除class_list中name_list中相同名稱的元素,同時我還需要知道名稱(如Bob)是否不在class_list中(例如,打印出bob是不在列表中)

對於上述示例中的結果應該是class_list = [信息(「約翰」)],並打印出該擺錘不在列表上。

我知道這樣做,如下面的代碼(我不實際運行它,只是一個例子)的醜陋的方式,有優雅或Python的方式做到這一點?

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