首页 > 解决方案 > 编写一个函数来对列表中的任意 2 个数字求和 - Python

问题描述

当“如果 nums 中的任何两个数字总和为目标,则该函数应返回 True。否则,返回 False”时,请您帮忙告知该函数中哪个部分错误。

非常感谢你的帮助!

random.seed(a=13, version=2)
random_numbers = random.sample(range(1000000),k=10000) # generate 10,000 random numbers in [1, 1,000,000)

def pair_exists(nums, target):   
    for i in nums:
        for j in nums:
            if i != j and i + j == target:
                print (i,j)
                return True
            elif i+j != target:
                print (i,j)
                return False

print(pair_exists(random_numbers, 38109)) # SHOULD RETURN TRUE
print(pair_exists(random_numbers, 13538)) # SHOULD RETURN FALSE

我得到了一个结果

271590 271590
False
271590 271590
False

标签: pythonfunction

解决方案


正如@AChampion的评论中提到的,这

         elif i+j != target:
            print (i,j)
            return False

将在第一个错误结果时退出函数。删除return False以继续搜索,并且仅return False在最后。


您的算法与 AChampions itertools.combination 方法一样有效,但使用一组所有数字并检查一半的数字是否满足条件

 (targetnumber - aktualnumber) in all_numbers 

更快:

import random

random.seed(a=13, version=2)
random_numbers = random.sample(range(1,1000001), k=10000) # fix numbers

def pair_exists(nums, target):
    first_half = nums[:len(nums)//2] # even number of elements in nums
    all_nums = set(nums) # use a set for speed reasons

    for num in first_half:
        if target - num in all_nums and target - num != num:
            print(num, target - num)
            return True

    return False

print(pair_exists(random_numbers, 38109)) # True for me
print(pair_exists(random_numbers, 2))  # always False

由于 1...1000000 的范围和最小的两个数字加起来为 3,因此取决于种子,较高的数字可能是也可能不是True,而永远不可能是真的。2


性能测量:

With  sets
0.0125215
0.0157244

With  for loops
51.583881399999996
170.0219317

With  itertools
57.5434453
100.71193929999998

要复制的代码:

import random
from itertools import combinations

def pair_exists(nums, target):
    first_half = nums[:len(nums)//2] # even number of elements in nums
    all_nums = set(nums) # use a set for speed reasons

    for num in first_half:
        if target - num in all_nums and target - num != num:
            # print(num, target - num)
            return True
    return False

def pair_exists_itertools(nums, target):
    for i, j in combinations(nums, r=2):
        if i != j and i + j == target:
            # print (i,j)
            return True
    return False

def pair_exists_forloops(nums, target):
    for i in nums:
        for j in nums:
            if i != j and i + j == target:
                # print (i,j)
                return True
    return False


random.seed(a=13, version=2)
random_numbers = random.sample(range(1,1000001), k=10000) # fix numbers

from timeit import timeit

def test_em(w, f):
    n = 10    # repeat only for 10 times to average measurements
    print("With ", w)
    print(timeit(lambda: f(random_numbers, 38109), number=n))
    print(timeit(lambda: f(random_numbers, 2), number=n))
    
for what, func in ( ("sets",      pair_exists), 
                    ("for loops", pair_exists_forloops), 
                    ("itertools", pair_exists_itertools)):
    test_em(what, func)

推荐阅读