我正在尝试编写一个函数pairSum(data,value),其中如果列表“data”包含两个总和等于“value”的不同数字,则该函数返回true。我使用列表完成了此操作,但有没有更有效的方法可以使用字典编写此函数?
问问题
316 次
3 回答
1
你可以试试用一套。
def pairSum(data, value):
s = set()
for i in data:
if (value - i) in s:
return True
else:
s.add(i)
else:
return False
于 2012-04-22T03:13:22.737 回答
1
from itertools import combinations
pairSum = lambda data, value: any(sum(i) == value for i in combinations(data, 2))
编辑
Pedro Werneck 指出,对 a 的成员资格测试set()
可能更有效:
pairSum = lambda data, value: value in set(sum(i) for i in combinations(data, 2))
进一步编辑
我接受了 Ignacio 的建议,并使用timeit
. 结果如下:
对于所有测试,测试的功能与我在原始答案(上图)中发布的功能相同。
timeit 执行次数为 10,000
data = range(100)
测试值发电机组
1 0.02824 10.84905
101 0.66934 10.77293
197 11.07062 10.73978
因此,结论似乎是生成器平均运行得更快,集合和生成器的最坏情况时间大致相同。
于 2012-04-22T03:18:17.563 回答
0
不是字典,但您可以构建所有组合并检查您的值是否在该集合中。
import itertools
def pairSum(data, value):
return value in set(map(sum, itertools.combinations(data, 2)))
如果您的列表不包含零或负值,您可以只保留低于列表中目标的值,因为将相等或更高的值与列表中的任何其他值相加将不匹配:
import itertools
def pairSum(data, value):
data = [v for v in data if v < value]
return value in set(map(sum, itertools.combinations(data, 2)))
于 2012-04-22T03:23:29.400 回答