Как создать список списков переборов чисел от 1 до k?(без повторений)

(В моем случае k=4) Есть список n, с 4(k) элементами, каждый из которых задается рандомно от 1 до 4(k), при этом ни одно число не должно повторяться... Теперь есть список N, в который мы хотим вставить список n, при этом также ни один список n не должен повторяться... Т.к. я не знаю (лень считать) итоговое кол-во списков n, то через for все прогоняем (За 100000 прогонов, думаю, слишком маленькая вероятность пропустить хотя бы одну комбинацию)

Код:

import random
N=[]
n=[]
for i in range(0,100000):
    n.clear()
    while len(n)!=4:
        x=random.randint(1,4)
        if n.count(x)==0:
            n.append(x)
    if N.count(n)==0:
        N.append(n)
print(len(N),N)

Проблема в том, что мне выводится какой-то бред: "1 [[любая комбинация из 1,2,3,4]]" Если print'ов наставить в коде, то становится понятно, что список n перебирается, один раз даже добавляется в N, но дальше ни-ни... А потом каким-то чудом список N чистится, но оставляет один пустой список внутри себя...


Ответы (2 шт):

Автор решения: Andrew Holovko

Замените n.clear() на n = [].

Когда вы делаете N.append(n) - вы добавляете объект (n) в список. И когда делаете n.clear() - он чистит объект n.

По этому у вас и результат соответствующий. Проверено.

→ Ссылка
Автор решения: TigerTV.ru

Мне кажется вы усложняете задачу прогоном 100000. И чем больше k, тем больше вероятность, что вы получите неверный результат, да и долго это. Лучше сначала создать перестановки, а потом их перемешать.

from itertools import permutations
import random

k = 4
*a, = permutations(range(1,k+1), k)
random.shuffle(a)
print(len(a),a)
→ Ссылка