[英]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.