1

我得到 3 个 int、a、b、c。如果它们是唯一的,我想找到所有三个 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]不在没有x的列表中的号码x[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 回答