0

我正在尝试编写一个函数pairSum(data,value),其中如果列表“data”包含两个总和等于“value”的不同数字,则该函数返回true。我使用列表完成了此操作,但有没有更有效的方法可以使用字典编写此函数?

4

3 回答 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 回答