簡體   English   中英

按屬性從對象列表中刪除對象

[英]Remove an object from a list of objects by attribute

我有一個對象列表。 該列表包含 Players,每個 Player 有 3 個屬性。 player_name、player_number 和玩家位置。 我想通過 player_name 搜索列表,找到該對象的第一個實例並刪除該對象。

p1 = Player("Pete", "12", "runner")
p2 = Player("John", "5", "catcher")
p3 = Player("John", "29", "guard")
player.list = [p1, p2, p3]

我想刪除 john 的第一個實例,即 p2

我可以搜索列表並找到他,但我不知道如何刪除他的整個對象。 我想以某種方式使用 .remove() ,因為我知道它在第一次看到它時有效,但我無法弄清楚。

for i in player.list:
    if i.player_name == "John":
        player.list.remove(i)

我的方法的問題是它刪除了所有這些,因為它遍歷整個列表。 搜索此列表的更好方法是什么,也許添加一個計數器或其他什么?

只需形成一個新列表:

players = [item
           for item in player.list 
           if not item.player_name == "John"]
for i in player.list:
    if i.player_name == "John":
        player.list.remove(i)
        break

這是一個簡單的解決方案:找到播放器(如果有),如果找到則將其刪除。

if any((to_go:= p).player_name == "John" for p in player.list):
    player.list.remove(to_go)

any(p.player_name == "John" for p in player.list)如果列表中的任何玩家的名字為 John,則返回True ,並盡快停止迭代。 如果不存在這樣的玩家,則返回False

Python 3.8 中的賦值表達式讓您可以捕捉到一個名為 John 的玩家存在這一事實的“見證”,即玩家對象本身。

if語句中,我們只是將to_go傳遞給player.list.remove以在any退出之前刪除綁定到to_go的最后一個玩家。 我們只在有any返回True調用remove 否則,如果沒有人的名字是約翰,我們將錯誤地刪除列表中的最后一個玩家。

這篇文章應該可以幫助你:

如何在迭代時從列表中刪除項目?

只是在你的決定中加入一個條件,在 1 被刪除后停止刪除?

暫無
暫無

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

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