【问题标题】:Item in list in dictionary PythonPython字典列表中的项目
【发布时间】:2021-07-11 13:45:39
【问题描述】:

我正在创建一个战舰游戏,我有一个外观字典,其中船和坐标作为它们的值,它们都保存在一个主类中的 self.__dict 字典对象中。

{'battleship': ['A1', 'A2', 'A3', 'A4'], 'cruiser': ['E1', 'F1', 'G3'], 'destroyer': ['D5', 'D6'], 'submarine': ['I9']}

当条目不在船坐标中时,我的代码应该放在板上“*”,当它在坐标中时,应该放在“X”上。

由于某种原因,代码没有读取值中的镜头,而是打印未命中的“*”镜头。

changin_line 变量,是游戏板中插入的新行,包含标记。

x_index 变量,是指应放置标记的参考坐标。

shot = "A3"
        
if shot not in self.__dict.values():
     changin_line.insert(x_index, "*")   
else:
     changin_line.insert(x_index, "X")

【问题讨论】:

  • self.__dict.values() 是一个可迭代字符串列表。它只能包含列表字符串,不能包含字符串。
  • 我之前在没有 .values() 的情况下拥有它,但它仍然不匹配它
  • values() 不是问题。
  • 巡洋舰是不是一分为二?在 E1、F1 和 G3 怎么可能?它应该在F2中间的对角线上吗?我承认我玩《战舰》已经快 50 年了,但我想我仍然记得基础知识。
  • G3 是个错误,应该是 G1,已修复,但与主要问题相比,这仍然是一个小问题:D

标签: python list dictionary conditional-statements


【解决方案1】:

self.__dict.values() 是一个列表列表,而不是一个位置列表。所以你将一个字符串与一个列表进行比较,这永远不会是真的。

您需要向下钻取另一个级别:

if not any(shot in ship_pos for ship_pos in self.__dict.values()):
    changin_line.insert(x_index, "*")
else:
    changin_line.insert(x_index, "X")

倒置数据结构可能会更好。不要使用船舶类型作为键,而是使用坐标作为键:

{'A1': 'battleship', 'A2': 'battleship', 'A3': 'battleship', 'A4': 'battleship',
 'E1': 'cruiser', 'F1': 'cruiser', 'G1': 'cruiser',
 ...
}

然后你可以测试if shot in self.__dict:。如果您想知道哪艘船被击中,只需self.__dict[shot]

顺便说一句,__dict 这个变量的名字似乎很糟糕。称它为ship_positions

【讨论】:

  • 这个标记“*”被设置为未命中,因此当我尝试现有位置并且它给出了那个标志时,我认为它不起作用。现在我只是翻转了标志,它按预期工作。非常感谢!
  • 抱歉,我的条件倒退了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2016-03-14
相关资源
最近更新 更多