如何找到具有给定数字列表的数字子集的数量?

时间:2018-07-07 04:18:54

标签: python list multiplication

我有这个数字,它是2个质数P和Q的乘积。示例

p=5
q=7
prod = int(p)*int(q)
#output: 35

还有另一组数字示例:

num = [5, 49, 10, 27]

我想从给定数字列表中找到乘积(P * Q)可能具有的子集数量,例如:

这些子集是(5,49),(5,49,10),(5,49,27),(5,49,10,27),(49,10),(49,10,27 )。有6个子集,输出为6。

2 个答案:

答案 0 :(得分:0)

虽然可以改进此问题的措词,但据我了解,您正在尝试查找给定列表中包含prod因素的所有子集。这是我想出的代码:

from itertools import chain, combinations
from numpy import prod

def powerset(iterable):
    "powerset([1,2,3]) --> () (1,) (2,) (3,) (1,2) (1,3) (2,3) (1,2,3)"
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))

def factor_subsets(a, factors):
    return filter(lambda s: prod(s) % factors == 0 , a)

ps = powerset(set([5, 49, 10, 27]))
pq = 35

answer = factor_subsets(ps,pq)
print(answer)
print(len(answer))

输出:

[(49, 10), (49, 5), (49, 10, 27), (49, 10, 5), (49, 27, 5), (49, 10, 27, 5)]
6

答案 1 :(得分:-1)

由于已知最大子集与集合长度之间的关系,而您只需要数字而不是实际的配对,我们可以使其保持更快的速度。

我将您的输入列表转换为一个集合,以去除所有重复项。

num = [5, 49, 10, 27]

subsetnumber = 1 # Always includes itself

subsetsin = set(num)
subsetlength = len(subsetsin)
for i in range(2, subsetlength):
    subsetnumber += subsetlength * (subsetlength-1) // i
print(subsetnumber)

这将返回11个2个或更多的唯一子集,对于1个或更多,只需将范围从“ 1”更改为“ 2”,

edit:谢谢下面的评论者,忘了算了。