我正在编写一个小游戏,其中计算机随机选择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