[英]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 list
是Mutable 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
如果元素不在列表中,則無法remove
其remove
。 如您所見,否則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.