簡體   English   中英

無法從Python中的列表列表中刪除字符串

[英]Can't remove string from list of lists in Python

在這個上掙扎。 用戶進行猜測,我正在嘗試使用HIT或MISS匹配列表列表。 如果有HIT,我也想從列表中刪除字符串。

player_ships = [['a1','b1','c1'],['a2','a3']]
print(player_ships)
guess = input("guess")
while any(guess in ship for ship in player_ships):
    print("HIT")
    for ship in player_ships:
        ship.remove(guess)
else:
    print("Miss!")

如果我從列表中輸入一個有效值進行猜測-例如:a1-我收到回溯到ship.remove(guess)行的錯誤,並帶有“ ValueError:list.remove(x):x不在”列出錯誤”,感謝您的幫助。

Python listMutable Sequence Type ,其remove方法在此處記錄。 請參閱腳注3,其中指出: “當在s中找不到x時,remove引發ValueError”。

您要從包含該猜測的發貨清單中刪除該猜測。 您可以通過首先檢查是否包含來請求許可 (不建議):

for ship in player_ships:
    if guess in ship:
        ship.remove(guess)

或者,您可以通過捕獲異常來原諒 與許多其他語言不同,Python的異常被認為是便宜的,因此鼓勵您依靠嘗試一些東西,捕獲異常並繼續進行:

for ship in player_ships:
    try:
        ship.remove(guess)
    except ValueError:
        pass

如果元素不在列表中,則無法removeremove 如您所見,否則Python將引發異常。

guess = "a1"

您的代碼遍歷player_ships

其第一個元素是['a1','b1','c1'] 您可以從其中刪除a1而不會出現錯誤,因為它在那里。

但是循環中的第二個元素是['a2','a3'] 它不包含a1 ,因此會出現錯誤。

之所以出現此錯誤,是因為在“命中”的情況下,您試圖從player_ships的所有子列表中刪除guess 但是它僅存在於一個子列表中。

您應先進行if檢查,以驗證guess是否在ship內,然后再將其刪除。

實現此目的的更簡單方法是將player_ships展平。 最好將其存儲為一set 例如:

>>> player_ships = [['a1','b1','c1'],['a2','a3']]
>>> flatten_set = set(ship for ships in player_ships for ship in ships)
>>> flatten_set
set(['a1', 'c1', 'a2', 'a3', 'b1'])

然后,其余的代碼邏輯可以寫成:

guess = input("guess")

while guess in flatten_set:
    print("HIT")
    flatten_set.remove(guess)
else:
    print("Miss!")

暫無
暫無

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

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