编写一个函数来对列表中的任意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

正如@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

根据种子的不同,较高的数字可能是也可能不是True,而2永远不可能是真的,因为范围为1…1000000,最小的两个数字加起来为3。


性能测量:

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)

在您编写此的地方

random.sample(范围(1000000(,k=10000(#在[11000000(中生成10000个随机数

尝试将代码更改为随机。sample(范围(1000000(,k=10000(

最新更新