Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找列表中的对数_Python - Fatal编程技术网

Python 查找列表中的对数

Python 查找列表中的对数,python,Python,假设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

假设
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_对([7,1,5,4,2,3,6],9)
give
6

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

在中有一个内置的:

或者,更一般地说:

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)]
你的代码是

  • 一次只考虑一个值(
    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
    VAL=设定值(lst)
    
    返回2*sum(为什么是6对?在一个7元素列表中,数字之间可能有更多的对…@TimPietzcker,求和key@TimPietzcker一点也不清楚,但我认为它们必须加起来等于给定的整数,在这种情况下为9。是的,假设加起来等于9。虽然这没有给出计数,只是列表,需要在en处添加
    len
    d或函数中。@Aruistante:哦,对了。在我看来,名为
    find\u pairs
    的函数应该返回对,而不是它们的数字。
    >>> 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)]
    
    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)