我在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方式吗?
答案 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
由于两个值相同,因此代码将自动返回 剩余价值。