6

私は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な方法はありますか?

4

7 に答える 7

13

任意の数の引数に対して機能する別の可能性:

from collections import Counter

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

iteritemsPython 2 では、一時リストの作成を避けるためにを使用する必要があることに注意してください。

于 2012-05-30T13:09:10.267 に答える
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)
于 2012-05-30T13:04:59.600 に答える
8

どうですか:

def lone_sum(*args):
      return sum(v for v in args if args.count(v) == 1)
于 2012-05-30T14:12:13.427 に答える
3

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 )
于 2012-05-30T13:10:07.640 に答える
0

Codingbat でこれを試しましたが、コード エディターでは動作しますが、動作しません。

def lone_sum(a, b, c): s = set([a,b,c]) return sum(s)

于 2020-06-05T04:11:04.243 に答える