我正在用数字制作python上的主谋游戏。如果元素的位置不正确,我在检查它们时会遇到问题。
所以基本上,如果计算机生成的代码没有重复,但用户在输入中使用了一些,比如(COMP:1 2 3 4和user:1 2 2 3)。我不能只检查一个'2'的位置,不能同时检查两个。请帮忙。
代码:
def incorrect_place():
incorrect_place = 0
if len(set(user_code)) != 4: #There are duplicates in the user's input
for index, num in enumerate(set(user_code)):
#I don't know how to check it now
incorrect_place += 1
return incorrect_place
我希望有人也能找到一个解决方案,其中计算机选择了一个副本,用户也选择了(COMP:1,2,2,3和用户:2,3,4,4)
基于对Mastermind是什么以及OP中的函数返回整数这一事实的一点研究,我的猜测是,您希望将计算机生成的列表与用户生成的相同大小的列表进行比较,看看有多少位置具有不同的值。
示例:
Computer: 1 2 3 4
User: 1 2 2 3
S S D D # S=Same, D=Different
所以上面的答案是2。
我建议如下:
def incorrect_places(comp_list, user_list):
return sum(1 if a != b else 0 for a, b in zip(comp_list, user_list))
工作原理:
zip(comp_list, user_list)
为我们提供了一个2元组的列表,根据它们出现的位置将每个列表中的相应值配对。对于上面的例子,我们得到:[(1, 1), (2, 2), (3, 2), (4, 3)]
1 if a != b else 0 for a, b in that_list
——如果对中的每个数字都相同,则返回1,否则返回0。因此,我们得到[0, 0, 1, 1]
最后我们sum
来得到我们的答案。希望这能有所帮助。
编辑:评论人士指出,这与sum(a != b for a, b in zip(comp_list, user_list))
是一样的。我更喜欢更长、可读性更强的版本,但它们的工作方式是一样的。这种差异纯粹是风格上的。选择你喜欢的版本。
我在阅读了两位炼金师的答案后理解了你的问题。这是我的尝试:
def list_differences(list_a, list_b):
# Subtract list_b from list_a, element by element. The subtraction
# will result in non-zero values for elements that were different.
return [bool(list_a[i]-list_b[i]) for i in range(len(list_a))].count(True)