繁体   English   中英

如何打印列表的元素,其总和等于 python 中的给定数字?

[英]how to print elements of a list whose sum is equal to a given number in python?

考虑一个从 0 到 50 的数字列表。我想打印该列表中所有元素的组合,其总和等于任何给定的数字,比如 41。一个组合是 [4,5,7,9,16]。我想要像这样打印其他组合。

@Anonymousss,看看这个:(注意 - 答案会给你一个元组对 - 两个数字加起来就是目标:41,在这种情况下)

这应该有效:

 from itertools import combinations

 nums = list(range(51))   # 0, 1, 2 to 50

 ans = [(x,y) for x, y in combinations(nums, 2) if x+y == 41]
>>> ans
[(0, 41), (1, 40), (2, 39), (3, 38), (4, 37), (5, 36), (6, 35), (7, 34), (8, 33), (9, 32), (10, 31), (11, 30), (12, 29), (13, 28), (14, 27), (15, 26), (16, 25), (17, 24), (18, 23), (19, 22), (20, 21)]

您可以使用来自itertoolscombinations(...) function

import itertools

nums = range(51)
for n in range(1, len(nums) + 1):
    for p in itertools.combinations(nums, n):
        if sum(p) == 41:
            print(*p)

以下代码最好在子程序中使用,但它可以是独立代码。要更改平均值,只需更改 while 循环后的数字即可。 要更改数字的数量,请更改列表中零的数量。 随机部分也可以根据数字范围进行更改。

def stats():
x =[0,0,0,0,0,0]
while mean(x) != 14.5:
    x =[0,0,0,0,0,0]
    for i in range(6):
        a = random.randint(9,17)
        x[i] = a
return x

此代码中的平均值是一个单独的子例程,如下所示:

def mean(x):
y = sum(x)/6
return y

在代码开始时,您需要导入随机库以使代码正常工作。 唯一的一点是,这段代码只会 output 一种组合,例如:

stats() [11, 12, 16, 17, 16, 15]

您可以编写一个递归生成器来有效地仅生成总和为目标数的正整数组合:

def sumSets(numbers,target):
    if not target  : yield []
    if not numbers or target <= 0: return
    yield from sumSets(numbers[1:],target)
    yield from (numbers[:1]+ss for ss in sumSets(numbers[1:],target-numbers[0]))

nums = list(range(1,50,3))
for ss in sumSets(nums,41): print(ss)
      
[19, 22]
[16, 25]
[13, 28]
[10, 31]
[7, 34]
[4, 37]
[1, 40]
[1, 4, 7, 13, 16]
[1, 4, 7, 10, 19]  

请注意,如果您要查找从 1 到 50 且总和为 41 的所有数字组合,您会得到很多:

nums = list(range(1,51))
print(sum(1 for _ in sumSets(nums,41))) # 1260

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM