有没有办法总结一个计数?

时间:2016-06-07 03:13:59

标签: python

这是我的第一篇文章,我将尽量详细说明。

我正在重建游戏“Mastermind”,但是使用字母而不是颜色。 颜色“红色”为“R”,“黄色”为“Y”等......

我必须检查错误,当用户输入错误时,输出应为guess = input("Error, try again: ")

任何错误都不能算作尝试。总共有8次尝试。我也必须检查其他事情,但我已经完成了那部分。

以下是我遇到问题的代码:

if len(guess) == 4 and (guess.upper().count("R") + guess.upper().count("Y") + guess.upper().count("B") +\
    guess.upper().count("G") + guess.upper().count("W") + guess.upper().count("O") == 4):

对于颜色RGYBWO,如果用户输入例如:RYGW,我可以将其总结为== 4吗?

简单来说,我可以检查每个字母是否存在并将它们加到= 4?

如果没有,我会发布完整的代码。

3 个答案:

答案 0 :(得分:2)

使用内置的sum

uppercase_guess = guess.upper() #no need to call it every time.
if sum(uppercase_guess.count(i) for i in "RGYBWO") == 4:
    ...

虽然如果你想检查每个角色是否是其中一个角色,可能会更清楚:

if ( all((i in "RGYBWO") for i in guess.upper())
    and len(guess) == 4):
    ...

答案 1 :(得分:2)

您的措辞不是100%明确,但我认为您在询问是否可以更有效地检查输入内容。有几种方法比现在更短,更灵活。

您要检查输入的长度是否为4,并且不包含任何非法字符。您的代码在功能上可以做到这一点但不是非常易于维护。检查len(guess) == 4对于第一部分是完美的。第二个在this question中有大约六个解决方案。以下是三个最重要的摘要:

  1. # Initialize this at module level
    allowed = set('rgbyow')
    # This is the check:
    if len(guess) == 4 and set(guess.lower()) < allowed:
        # OK
    
  2. # Initialize this at module level
    allowed = set('rgbyow')
    # This is the check:
    if len(guess) == 4 and all(c in allowed for c in guess.lower()):
        # OK
    
  3. # Initialize this at module level
    import re
    allowed_expr = re.compile('[rgbyowRGBYOW]{4}')
    # This is the check:
    if allowed_expr.match(guess):
        # OK
    

答案 2 :(得分:0)

试试这个:

因为红色可能真的是两个“R”或“r”代码。

allowed = 'RrGgBbYyOoWw' # So, now you accept either case and drop `.upper()`

if len(guess) == 4 and sum([guess.count(i) for i in allowed]):