繁体   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