关于比较 Python 中两个列表的问题



我正在编写一个小游戏,其中计算机随机选择4种颜色作为密码,用户的工作是猜测他们认为颜色是什么,并根据您与密码的距离提供线索。当猜测列表中的元素匹配时,程序会将线索值 2 附加到新列表,如果猜测列表中的元素与位置不匹配但出现在密码列表中,它应该将值 1 附加到我们的线索列表中。

我遇到的一个问题是当您将猜测列表与密码列表进行比较时。下面是一个示例:

假设计算机密码是否是一个包含 4 个元素的列表,如下所示:["Blue", "Yellow", "Green", "Red"]而你的猜测["Blue", "Blue", "Green", "Red"],程序返回一个线索列表[2, 1, 2, 2]。我希望它返回[2, 2, 2],因为我不想在密码中只出现一次时重复计算猜测列表中的蓝色猜测。

这是到目前为止函数的代码。

def get_clue(secret_code, guess_list):
clue_list = []    
for i in range(len(guess_list)):
if guess_list[i] == secret_code[i]:
clue_list.append(2)
elif guess_list[i] != secret_code[i] and guess_list[i] in secret_code:
clue_list.append(1)
else:
clue_list = clue_list
print("Your Clue is : ", clue_list)
return clue_list

我要做的第一个更改是删除一些冗余代码:

  • elif的条件可以缩短 - 我们已经知道
    guess_list[i] != secret_code[i]如果第一个 if 语句没有被执行,所以我们不需要显式检查。
  • 此外,您的else分支什么都不做,那么为什么还要包括 它?您也可以安全地删除它。
  • 我也会删除打印语句。我没想到 前缀为get_的函数具有打印副作用。如果 您需要打印clue_list的内容,在 调用代码一次get_clue返回。

通过这些更改,您的代码如下所示:

def get_clue(secret_code, guess_list):
clue_list = []
for i in range(len(guess_list)):
if guess_list[i] == secret_code[i]:
clue_list.append(2)
elif guess_list[i] in secret_code:
clue_list.append(1)
return clue_list

以下是我要做的第二轮更改:

  • get_clue这个名字并不完全准确来描述这一点 功能。这个函数返回一个线索列表,所以我认为更好的 名称将是get_clues
  • secret_code不是第一个参数的好名字。这是一个列表 的秘密。我要么称它为secrets,要么称它为secret_codes.
  • guess_list不是第二个参数的好名字。我们可以看到 这个对象是一个列表,因为我们正在做 类似列表的东西,所以不要在名称中包含"列表"。我 会抛弃这种讨厌的习惯,即在 变量的标识符。更好的名字是guesses.
  • 同样的事情也适用于clue_list.我们已经知道这是一个列表。不要 使"列表"成为名称的一部分。更好的名字是clues.
  • 而不是使用索引("索引"的复数形式(,我们可以得到更多 Pythonic 通过使用zip同时遍历两个列表 时间。

通过这些更改,您的代码现在如下所示:

def get_clues(secrets, guesses):
clues = []
for secret, guess in zip(secrets, guesses):
if guess == secret:
clues.append(2)
elif guess in secrets:
clues.append(1)
return clues

说到这里,你说:

我希望它返回 [2, 2, 2],因为我不想重复计算 蓝色猜测

不过,您不希望clues始终具有四个元素吗?如果我的猜测是
["Blue", "Blue", "Blue", "Blue"],而get_clues返回[2],我无法知道Blue到底在哪里。

您可以使用一组来跟踪以前做出的猜测:

def get_clues(secrets, guesses):
clues = []
previous_guesses = set()
for secret, guess in zip(secrets, guesses):
if guess == secret:
clues.append(2)
elif guess not in previous_guesses and guess in secrets:
clues.append(1)
previous_guesses.add(guess)
return clues

相关内容

  • 没有找到相关文章

最新更新