【问题标题】:Python sum of non duplicate int非重复整数的Python总和
【发布时间】:2013-10-04 03:35:46
【问题描述】:

我得到了 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

【问题讨论】:

    标签: python if-statement sum unique


    【解决方案1】:
    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)
    

    【讨论】:

      【解决方案2】:

      这是一个很好的初学者解决它的方法

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

      这里的问题是args.count是一个隐藏循环,所以计算变成了O(n2)

      如果只有 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
      

      【讨论】:

      • 哇!!..非常非常简单:) 好记
      • @gnibbler - 谢谢!!看来我在 Python 方面还有很长的路要走。每个可能的答案都有助于我学习新知识。
      【解决方案3】:

      我在这里列出您的号码,将其命名为x,然后仅选择那些不在x 列表中没有x[i]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]
      

      【讨论】:

      • 你缺少一个右括号
      • 是的,似乎返回了你需要的东西。
      • 是的工作... +但不明白,请解释一下
      • @Grijesh,我已经添加了一些解释,请查看。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2020-12-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 2013-08-17
      • 1970-01-01
      相关资源
      最近更新 更多