如何解决编写函数以求和列表中的任意两个数字-Python
当“如果num内的任意两个数字加总到目标,则该函数应返回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,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(range(1000000),k = 10000)#在[1,1,000,000)中生成10,000个随机数
尝试将代码更改为random.sample(range(1,1000000),k = 10000)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。