python 中随机列表的总和

Sum from random list in python

我创建了一个包含 60 个号码的随机列表,我不知道列表中包含的号码。我被要求从列表中找到总和为零的三个数字的任意组合。我能做什么? 那是我的代码:

import random
import itertools
result = []

for x in range (-30, 30):
   num = random.randint(-30, 30)
   while num in result:
     num = random.randint(-30, 30)
     result.append(num)
        result = [seq for i in range(len(result), 0, -1) for seq in itertools.combinations(result, i) if sum(seq) == 0]
print result

为了演示的目的,我将为 result 定义一个特定的示例值,我们可以用它来测试并看看会发生什么。

result = [1, 2, -2, -3, 4]

您可以使用itertools.combinations列出三个数字的所有组合。

import itertools

>>> list(itertools.combinations(result, 3))
[(1, 2, -2),
 (1, 2, -3),
 (1, 2, 4),
 (1, -2, -3),
 (1, -2, 4),
 (1, -3, 4),
 (2, -2, -3),
 (2, -2, 4),
 (2, -3, 4),
 (-2, -3, 4)]

并且您可以使用 filterlambda c: sum(c) == 0 作为总和为零的 select 组合的谓词。

>> list(filter(lambda c: sum(c) == 0, itertools.combinations(result, 3)))
[(1, 2, -3)]

itertools中有一个函数combinations,可以用来生成组合

import random
import itertools
# Generate a random list of 30 numbers
mylist = random.sample(range(-50,50), 30)

combins = itertools.combinations(mylist, 3)
interested = list(filter(lambda combin: sum(combin) == 0, combins))
print(interested)

请注意,filter()itertools.combinations() 的结果是可迭代的,需要 list() 才能将可迭代转换为列表。

lambda表达式lambda combin: sum(combin) == 0用于保留combins

中和为零的组合

itertools.combinations(): https://docs.python.org/3.6/library/itertools.html#itertools.combinations

filter(): https://docs.python.org/3.6/library/functions.html?highlight=filter#filter