有三个3号码可以使用。无匹配= 0,2匹配= 10,如果所有匹配= 20

时间:2016-11-04 16:53:55

标签: python

这是我的代码,当三个数字中只有两个匹配时,它不会返回10。

def green_ticket_value(a, b, c):
  if a != b or b != c or a != c:
    return 0
  elif a == b and a != c or b == c and b != a or a == c and a!= b:
    return 0 
  else: a == b == c
  return 20

3 个答案:

答案 0 :(得分:1)

首先,第二个"返回0"应该是"返回10"。

其次,(这可能会或可能不会产生影响),您可能需要在elif行中使用括号。

def green_ticket_value(a, b, c):
    if a != b or b != c or a != c:
        return 0
    elif (a == b and a != c) or (b == c and b != a) or (a == c and a!= b):
        return 10 # NOT 0
    else: a == b == c
        return 20

答案 1 :(得分:0)

问题在于第一个if语句逻辑。您使用or代替and,这就是您永远不会比较第二个陈述的原因。

假设a=1 b=2c=2 在你当前的代码中,确实a!= b是一个有效的语句,它返回0
它应该是:

def green_ticket_value(a, b, c):
    if a != b and b != c and a != c:
    #rest of code

你也可以使用另一种方法,即使用计数器并返回最常用的值

from collections import Counter

def green_ticket_value(*args):
    green = Counter(args)
    values = {1:0,2:10,3:20}
    return values[green.most_common(1)[0][1]]

答案 2 :(得分:0)

以这种方式思考。如果

a != b or b != c or a != c

是假的,那么

a == b and b == c and a == c

DeMorgan's Laws解释为什么会这样。请记住

~(A \/ B) <-> ~A /\ ~B
~(A /\ B) <-> ~A \/ ~B

<->基本上表示“彼此相同”,~表示“不”,\/表示“或”,/\表示“和”。< / p>

要完成此代码:

def green_ticket_value(a, b, c):
    if a != b or b != c or a != c:
       return 0
    # It can *never* be the case that a != c or a != b at this point
    elif a == b and a != c or b == c and b != a or a == c and a!= b:
      return 0 // Should this be "return 10"?
   # What did you mean to do here?
   else: a == b == c
       return 20

有点不清楚你的意思是否

a == b and a != c or b == c and b != a or a == c and a!= b

表示

(a == b and a != c) or (b == c and b != a) or (a == c and a!= b)

永远是假的(a == c和a == b,这意味着所有这些条件都是假的),或者以下内容:

a == b and (a != c or b == c) and (b != a or a == c) and a!= b

也总是假的(事实上,它是自我反驳的,因为它包含a == b && a != b)或者你是否意味着其他变体。我强烈建议在这里使用父母,以便更清楚地了解您要做的事情。

另外,最后一部分:

(b == c and b != a) or (a == c and a != b)

a != bb != a意思完全相同,所以上述陈述与

相同
a != b and (a == c or b == c)