生成一定程度的所有多项式项

时间:2016-12-01 23:32:15

标签: arrays python-2.7 numpy itertools

列出n个术语

ts = ['t1','t2','t3',...,'tn']

有一项任务是实现这些术语的所有可能的q长度组合。

因此,对于

ts = ['t1','t2']
q = 4

答案将是

[['t1','t1','t1','t1'],['t1','t2','t2','t2'],['t1','t1','t2','t2'],
 ['t1','t1','t1','t2'],['t2','t2','t2','t2']]

这是我的解决方案

powers = np.array(list(itertools.product(*[range(q+1)]*len(ts))))
powers = powers[np.where(np.asarray(map(sum, powers))==q)]
res = map(lambda ps_: flatten([ p*[t] for p,t in zip(ps_,ts) ]), powers)

其中flatten是从列表列表生成列表的函数。

在获得产生预期结果的解决方案的同时,我想知道是否有更简单的方法来解决这个问题?

1 个答案:

答案 0 :(得分:1)

您需要的是替换组合。最简单的解决方案是使用恰当命名的itertools.combinations_with_replacement

>>> list(itertools.combinations_with_replacement(ts,q))
[('t1', 't1', 't1', 't1'),
 ('t1', 't1', 't1', 't2'),
 ('t1', 't1', 't2', 't2'),
 ('t1', 't2', 't2', 't2'),
 ('t2', 't2', 't2', 't2')]