2014-04-13 65 views
3

假設lst = [7,1,5,4,2,3,6]對數量,(7, 2), (5, 4), (6, 3)是一些對和總有6個對,加起來9查找列表

(I)號的一對的順序很重要。例如,(7,2)和(2,7)是兩對不同的對。 (ii)一個號碼不能與自身配對。 (iii)列表中沒有重複元素

def find_pairs(lst, key): 
    count = 0 
    if sum(lst[count:count+1]) == key: 
     count += 1 
     return count 
    else: 
     return find_pairs(lst[1:],key) 

這是我的代碼。怎麼了 ??我得到一個錯誤 輸入find_pairs([7,1,5,4,2,3,6], 9)6

find_pairs(list(range(1, 100, 2)), 55) #0 
find_pairs(list(range(1, 100, 2)), 56) #28 
+0

爲什麼6雙?在7個元素的列表中,數字之間還有更多的可能對... –

+0

@TimPietzcker,Sum to key – sshashank124

+1

@TimPietzcker它根本不清楚,但我認爲它們必須加起來給定一個整數, case 9. –

回答

5

有一個內置爲此在itertools module

def find_pairs(lst, key): 
    return [(a,b) for a,b in itertools.permutations(lst, 2) if a+b==key] 

,或者更一般:

def find_tuples(lst, key, num=2): 
    return [i for i in itertools.permutations(lst, num) if sum(i)==key] 

您可以使用它是這樣的:

>>> find_tuples(lst, 9) 
[(7, 2), (5, 4), (4, 5), (2, 7), (3, 6), (6, 3)] 
>>> find_tuples(lst, 9, 3) 
[(1, 5, 3), (1, 2, 6), (1, 3, 5), (1, 6, 2), (5, 1, 3), (5, 3, 1), (4, 2, 3), 
(4, 3, 2), (2, 1, 6), (2, 4, 3), (2, 3, 4), (2, 6, 1), (3, 1, 5), (3, 5, 1), 
(3, 4, 2), (3, 2, 4), (6, 1, 2), (6, 2, 1)] 
+2

雖然這並沒有給出計數,只是列表,需要在最後或在函數中添加「len」。 – aruisdante

+1

@aruisdante:哦,對。在我看來,一個名爲'find_pairs'的函數應該返回對,而不是它們的數量。 –

0

您的代碼是

  1. 只考慮在一個時間的單一值(lst[i:i+1]是包含單一項目的切片,相同[lst[i]]

  2. (一次即固定的)代碼僅考慮相鄰的值對 - 在你的例子中,(7, 2)永遠不會被找到,因爲7不是在輸入列表中的2旁邊

  3. 使用遞歸完全沒有很好的理由

這裏是一個更有效的版本(的O(n)代替O(n**2)):

def find_pairs_count(lst, pair_sum): 
    upto = (pair_sum - 1) // 2 
    vals = set(lst) 
    return 2 * sum(i <= upto and (pair_sum - i) in vals for i in lst)