2016-12-01 57 views
1

有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是从列表的列表产生列表功能。

虽然有解决方案,产生所需的结果,我想知道是否有更简单的方法来解决这个问题?

+0

这些不是排列组合。他们可能与替换组合。 –

+0

谢谢,我错过了,做了一个更正。 – tarashypka

回答

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')] 
+0

谢谢,那就是我一直在寻找的! – tarashypka

+0

@tarashypka不用担心,直到你了解它是什么,才能确定正确的名字:) –