Как создать список списков переборов чисел от 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 шт):
Замените n.clear() на n = [].
Когда вы делаете N.append(n) - вы добавляете объект (n) в список. И когда делаете n.clear() - он чистит объект n.
По этому у вас и результат соответствующий. Проверено.
Мне кажется вы усложняете задачу прогоном 100000. И чем больше k, тем больше вероятность, что вы получите неверный результат, да и долго это. Лучше сначала создать перестановки, а потом их перемешать.
from itertools import permutations
import random
k = 4
*a, = permutations(range(1,k+1), k)
random.shuffle(a)
print(len(a),a)