苦苦挣扎。用户猜测并且我尝试使用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 - 我在使用" ValueError:列表的ship.remove(guess)行中得到一个追溯错误。删除(x):x不在列表错误"任何帮助表示赞赏。
答案 0 :(得分:2)
Python list
是Mutable Sequence Type,其remove
方法记录在那里。见脚注3,其中指出:"当在s中找不到x时,删除引发的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
答案 1 :(得分:0)
如果某个元素不存在,则您无法remove
列表中的元素。否则,Python将抛出异常,如您所见。
说guess = "a1"
。
您的代码会重复player_ships
。
其中第一个元素是['a1','b1','c1']
。您可以从中删除a1
而不会出现错误,因为它就在那里。
但循环中的第二个元素是['a2','a3']
。这不包含a1
,因此您会收到错误。
答案 2 :(得分:0)
您收到此错误,因为在" HIT"的情况下,您试图从guess
的所有子列表中删除player_ships
。但它仅存在于子列表中的一个中。
在删除之前,您应该进行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!")