1

3 つの int、a、b、c が与えられます。3 つの int が一意であるという条件で、これらすべての合計を求めたいと思います。a、b、または c の値が他の値と同じ場合、それらは合計にはカウントされません。

例 1:

a = 3, b = 3, c =3
sum = 0

例 2

a = 1, b = 3, c =3
sum = 1

これが私がやったことです。if else ステートメントをあまり使わずに、これを行うより Pythonic な方法はありますか?

def lone_sum(a, b, c):
    if a != b and b != c and a != c:
        return a + b + c

    elif a == b == c:
        return 0

    elif a == b:
        return c

    elif b == c:
        return a

    elif a == c:
        return b
4

3 に答える 3

4
from collections import Counter
def lone_sum(a, b, c):
    d = Counter([a, b, c])
    return sum(k for k in d if d[k]==1)

任意の数の数字を追加します:

def lone_sum(*L):
  d = Counter(L)
  return sum(k for k in d if d[k]==1)

正確な回数繰り返される数を加算するc

def rep_sum(c, *L):
  d = Counter(L)
  return sum(k for k in d if d[k]==c)

cほとんどの回数繰り返される数を追加します。

def rep_sum(c, *L):
  d = Counter(L)
  return sum(k for k in d if d[k]<=c)

... または、退屈で本当にクリエイティブになりたい場合:

def lone_sum(*L):
  nums = set()
  all_nums = set()
  for num in L:
    if num in nums:
      nums.remove(num)
    elif num not in all_nums:
      all_nums.add(num)
      nums.add(num)
  return sum(nums)
于 2013-10-04T03:37:42.580 に答える
3

これはそれを解決するための良い初心者の方法です

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

これに関する問題は、それargs.countが隠れたループであるため、計算が O(n 2 )になることです。

引数が 3 つしかない場合、つまり n == 3 の場合、これはあまり重要ではありません。

同じことを手書きで書く方法は次のとおりです。

def lone_sum(a, b, c):
    args = (a, b, c)
    s = 0
    for x in args:
        if args.count(x) == 1:
            s += x
    return s
于 2013-10-04T03:48:40.470 に答える
1

ここでは、あなたの番号のリストを取得して と呼び、のないリストにないものxだけを選択します。つまり、重複しているすべての番号を削除します。x[i]xx[i]

def lone_sum(a, b, c):
    x = [a,b,c]
    x = [x[i] for i in range(len(x)) if x[i] not in [x[j] for j in range(len(x)) if j!=i]]
    return sum(x)

そう、

[x[j] for j in range(len(x)) if j!=i]

は基本的に を除く要素のリストですx[i]ith以外のすべての要素を取ります。がこのリストにある場合x[i]は、重複していることを意味し、削除する必要があります。あれは、

x[i] not in [x[j] for j in range(len(x)) if j!=i]
于 2013-10-04T03:40:19.133 に答える