2016-04-19 4 views
1

В течение нескольких дней я пытаюсь найти способ создания всех списков длины «n» из списка элементов «q». До сих пор я смог получить мудрец, чтобы распечатать все списки, которые я хочу получить. Однако, поскольку мне нужны эти списки для другой программы, мне нужна моя программа для вывода списка всех этих списков вместо того, чтобы просто иметь Sage для печати списков. До сих пор я знаю:Создание всех списков длины «n» из списка элементов q

def XUniv(q,x,n): 
    """ 
    :param q: is your alphabet size 
    :param x: is a zero vector of any length 
    :param n: is len(x)-1 
    """ 
    for i in range(q): 
     x[n]=i 
     if n==0: 
      print x 
     else: 
      XUniv(q,x,n-1) 
+0

Вид неясного вопроса. Вы хотите, чтобы все перестановки целых чисел с фиксированной длиной n? –

+0

Нет. Скажем, q = 2 и n = 3, тогда я хочу, чтобы моя функция выводила [[0,0,0], [0,0,1], [0,1,0], [0,1,1 ], [1,0,0], [1,0,1], [1,1,0], [1,1,1]] – Drumma0

+0

Хорошо, поэтому перестановки фиксированной длины n целых чисел меньше q. –

ответ

3

Что-то вроде этого, чего вы хотите?

sage: q=1 
sage: n=3 
sage: L = IntegerListsLex(min_part=0, max_part=q, length=n) 
sage: list(L) 
[[1, 1, 1], 
[1, 1, 0], 
[1, 0, 1], 
[1, 0, 0], 
[0, 1, 1], 
[0, 1, 0], 
[0, 0, 1], 
[0, 0, 0]] 
2

Без Sage:

import itertools 
def all_lists_from_q_elements(q, n): 
    all_lists_iter = itertools.product(tuple(range(q)), repeat=n) 
    return [list(l) for l in all_lists_iter] 
+0

Это не возвращает все перестановки, поэтому, например, результат содержит '(0, 0, 1)', но не '(1, 0, 0)'. –

+0

@JohnPalmieri Да, я использовал неправильную функцию: \ Теперь это исправлено. – jonaslb