假设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 :(得分: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)]
答案 1 :(得分:0)
您的代码是
一次只考虑一个值(lst[i:i+1]
是包含单个项目的切片,与[lst[i]]
相同)
(一旦修复)你的代码只考虑相邻的值对 - 在你的例子中,(7, 2)
永远不会被找到,因为7在输入列表中不是2的旁边
绝对没有充分理由使用递归
以下是效率更高的版本(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)