2016-12-01 3 views
1

Имея список русских терминовСформировать все полиномиальные члены определенной степени

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

есть задача достичь всех возможных комбинаций д-длина этого условия.

Таким образом, для

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 не беспокоится, сложно определить имя, пока вы не узнаете, что это такое :) –

 Смежные вопросы

  • Нет связанных вопросов^_^