列出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 :(得分: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')]