例如,假设给定的int列表:
int_list = list(range(-10,10))
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
如果
int_list
和中任何给定的两个值等于给定的int,比如2
,那么最有效的方法是什么?今天早上,我在一次技术电话采访中被问及如何有效地处理这个场景,比如说,1亿个项目(我漫无目的地说,没有好的答案:/)。
我的第一个想法是:
from itertools import combinations
int_list = list(range(-10,10))
combo_list = list(combinations(int_list, 2))
desired_int = 4
filtered_tuples = list(filter(lambda x: sum(x) == desired_int, combo_list))
filtered_tuples
[(-5, 9), (-4, 8), (-3, 7), (-2, 6), (-1, 5), (0, 4), (1, 3)]
它甚至不能在
int_list
的范围内工作另外,有人知道一个好的在线Python性能测试工具吗?
最佳答案
对于任何整数A
而言,至多有一个整数B
将相加为等于整数N
。浏览列表、进行算术运算和进行成员资格测试以查看B
是否在集合中似乎更容易。
int_list = set(range(-500000, 500000))
TARGET_NUM = 2
def filter_tuples(int_list, target):
for int_ in int_list:
other_num = target - int_
if other_num in int_list:
yield (int_, other_num)
filtered_tuples = filter_tuples(int_list, TARGET_NUM)
请注意,这将复制结果。例如,
(-2, 4)
是(4, -2)
的单独响应。可以通过更改函数来解决此问题:def filter_tuples(int_list, target):
for int_ in int_list:
other_num = target - int_
if other_num in int_list:
set.remove(int_)
set.remove(other_num)
yield (int_, other_num)
关于python - 返回列表中任何两个项目的元组,如果相加等于给定的int,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23964488/