检查一个列表中的元素是否与另一列表中的另一个元素具有相同的索引



我正在用数字制作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)

最新更新