【问题标题】:Question regarding comparison of two lists in Python关于比较Python中两个列表的问题
【发布时间】:2019-12-03 19:57:02
【问题描述】:

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

【问题讨论】:

  • 查看集合。

标签: python list compare


【解决方案1】:

我要做的第一个改变是去掉一些多余的代码:

  • 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 不是第一个参数的好名字。这是一个清单 的秘密。我会称它为secretssecret_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

【讨论】:

  • 感谢您的快速响应和建议,您的 4 个“蓝色”猜测示例实际上是我的本意,因为您要进行多次猜测,因此本质上是反复试验.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多