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