寻找更加pythonic的逻辑解决方案

时间:2012-05-30 12:59:51

标签: python logic

我在Coding Bat做了一些练习问题,遇到了这个问题..

Given 3 int values, a b c, return their sum. However, if one of the values is the same as another of the values, it does not count towards the sum. 

lone_sum(1, 2, 3) → 6
lone_sum(3, 2, 3) → 2
lone_sum(3, 3, 3) → 0 

我的解决方案如下。

def lone_sum(a, b, c):
   sum = a+b+c
   if a == b:
     if a == c:
         sum -= 3 * a
     else:
         sum -= 2 * a
   elif b == c:
     sum -= 2 * b
   elif a == c:
     sum -= 2 * a
   return sum

有更多的pythonic方式吗?

7 个答案:

答案 0 :(得分:13)

另一种适用于任意数量参数的可能性:

from collections import Counter

def lone_sum(*args):
    return sum(x for x, c in Counter(args).items() if c == 1)

请注意,在Python 2中,您应该使用iteritems来避免构建临时列表。

答案 1 :(得分:8)

任何数量的参数的更通用的解决方案是

def lone_sum(*args):
    seen = set()
    summands = set()
    for x in args:
        if x not in seen:
            summands.add(x)
            seen.add(x)
        else:
            summands.discard(x)
    return sum(summands)

答案 2 :(得分:8)

怎么样:

def lone_sum(*args):
      return sum(v for v in args if args.count(v) == 1)

答案 3 :(得分:2)

可以使用defaultdict筛选出多次出现的元素。

from collections import defaultdict

def lone_sum(*args):
  d = defaultdict(int)
  for x in args:
    d[x] += 1

  return sum( val for val, apps in d.iteritems() if apps == 1 )

答案 4 :(得分:0)

def lone_sum(a, b, c):
    z = (a,b,c)
    x = []
    for item in z:
        if z.count(item)==1:
            x.append(item)
    return sum(x)

答案 5 :(得分:0)

我在Codingbat上尝试了此方法,但尽管在代码编辑器上也可以,但是它不起作用。

def lone_sum(a,b,c): s = set([a,b,c]) 返回总和

答案 6 :(得分:0)

与您拥有的方法非常相似:

def lone_sum(a, b, c):

  if a != b and b != c and c != a:
    return a + b + c

  elif a == b == c:
    return 0 

  elif a == b:
    return c
  elif b == c:
    return a
  elif c == a:
    return b

由于两个值相同,因此代码将自动返回 剩余价值。