我正在使用数字在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,3,3& USER:2,3,4,4)
答案 0 :(得分:1)
基于对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))
相同。我更喜欢更长,更易阅读的版本,但它们的工作方式相同。这种差异纯粹是风格上的。选择您喜欢的版本。
答案 1 :(得分:0)
在阅读了两位炼金术士的回答后,我理解了你的问题。 这是我的尝试:
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)