2013-10-04 37 views
1

我給3 int,a,b,c。我想找到所有三個int的總和,只要它們是唯一的。如果a,b或c與任何其他值具有相同的值,則它們不計入總和。Python總和非重複int

例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
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) 
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]元素的列表。它需要除了i th之外的所有元素。如果x[i]在此列表中,則表示它是重複的,我們需要將其刪除。也就是說,

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

你錯過了一個閉括號 – TerryA

+0

我認爲它現在應該工作。讓我測試它... – sashkello

+0

是的,似乎要返回你所需要的。 – sashkello

3

這裏是一個很好的初學者的方式來解決它

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

這樣做的問題是args.count是一個隱藏的循環,所以計算變得爲O(n )

這並沒有多大關係,如果有永遠只能3個參數 - 即,n == 3

一個手寫的方式來寫相同的T hing是

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 
+0

WaW !! ..這是非常非常簡單:)容易記住 –

+1

@gnibbler - 謝謝!說到Python,我看起來還有很長的路要走。每一個可能的答案都能幫助我學習新東西 – Cryssie