簡體   English   中英

如何從列表中刪除某些值的對象?

[英]How do I remove objects of certain values from a list?

我有很多對象(您可以使用Classes做的事情,是嗎?)。 我想瀏覽此列表並刪除具有特定值的對象。 然后,我將使用排序后的列表來挑選隨機元素,並將其用於其他用途。

我應該使用字典還是數組或其他東西代替對象和列表? 我對此很陌生,很抱歉,如果它很簡單,或者我做錯了什么。

例:

class Person:
    def __init__(self, name, gender, otherVar, otherVar2):
        self.name = name
        self.gender = gender
        self.otherVar = otherVar
        self.otherVar2 = otherVar2
        ## also more variables if that makes a difference

John = Person("John", boy, otherVar, otherVar2)
Jane = Person("Jane", girl, otherVar, otherVar2)   ## etcetera


myList = [John, Jane, Mary, Derek, Bob, Sue]
simpleThingThatIdoNotUnderstand():                 ## removes all the 
                                                   ## girls
myList = [John, Derek, Bob]

我知道我需要某種遍歷列表的循環(盡管有很多方法,但我不確定哪種方法會起作用),但是如何引用列表中對象的值呢? 就像“如果性別=女孩,請刪除項目”

您可以通過幾種方法來執行此操作,而某些方法則比其他方法更快或更短。

最簡單的方法是遍歷整個列表,檢查項目是否符合某些條件,然后刪除該項目。 特別是因為您要對整個人施加條件。

在您的示例中,這可能類似於:

# removes all people of the specified gender
def removePeopleByGender(people, gender):
   output = []

   for person in people:
       # assumes person.gender and gender are the same data type
       if (person.gender != gender):
           output.append(person)

   return output

通常,字典是(鍵,值)配對的首選字典,在這種配對中,您將擁有一組鍵或特定鍵,並試圖進行快速查找。 它們針對查找O(1)進行了優化,但使用了更多的內存。

這將列出新的男孩:

boys = [person for person in myList if person.gender == boy]

最好創建一個新列表,而不是嘗試從列表中刪除對象。

有幾種不同的方法可以執行此操作,具體取決於您想對符合條件的項目(在這種情況下,與女孩相對應的對象)進行處理。 給定您要開始的列表:

myList = [John, Jane, Mary, Derek, Bob, Sue]

最直接的方法是建立另一個僅包含女孩的列表。 有一種稱為列表理解的結構非常適合此目的:

new_list = [<expression> for <variable> in <original_list> if <condition>]

這樣做是通過<original_list>每個元素,將<variable>臨時設置為該元素,測試<condition>以查看其是否為真,如果是,它將評估<expression>並將其放入新列表中。 它與以下代碼完全相同:

new_list = []
for <variable> in <original_list>:
    if <condition>:
        new_list.append(<expression>)

除了更緊湊的代碼之外,有經驗的Python程序員更容易閱讀。

在您的情況下:

  • <original_list>myList
  • <variable>可以是任何Python標識符; 假設person
  • 如果該人是女孩,則<condition>將為真,這意味着person.gender == girl
  • <expression>只是person本身,因為您只想要原始列表中的相同對象,而不是它的某些屬性或功能或類似的東西

我將把這些組件代入原始列表推導中。

使用經典for item in list:無法解決問題,因為您無法從該循環內的列表中刪除元素。

首先,您會說您定義了一個接受Person的函數,如果應該保留在列表中,則返回true;如果應該刪除它,則返回false。 假設您將函數命名為keep_person。 之后,您可以使用以下方法之一:

使用過濾器功能(推薦):

myList = filter(keep_person, myList)

或以這種方式,如果您喜歡好的舊循環:

people_to_remove = []
for person in myList:
    if not keep_person(person):
        people_to_remove.append(person)

for person in people_to_remove:
    myList.remove(person)

當然,還有許多其他方法可以做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM