无法从Python中的列表列表中删除字符串

时间:2017-03-10 20:32:25

标签: 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 - 我在使用" ValueError:列表的ship.remove(guess)行中得到一个追溯错误。删除(x):x不在列表错误"任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:2)

Python listMutable 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!")