python - 编写一个函数来对列表中的任意 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
由于 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)
推荐阅读
- css - 在css中使用不带函数的正则表达式
- javascript - NextJS:视差逻辑问题
- azure-devops-server-2019 - Azure Devops Server 能否预配硬件
- javascript - 使用 ajax 和 php 将数据库值传递给选择
- amazon-web-services - AWS 中的数据传输成本
- java - 商品数量折扣
- android - 如何删除我的布局背景以便我可以看到它背后的活动?
- python - 从 QFrame 内的 QPushButton 到另一个 QWidget 的单击事件
- c# - C#如何验证字符串属性只接受10位数字
- java - Pdf文件重命名和删除在我的Android应用程序中不起作用