Моя цель - найти любую перестановку диагонали в матрице nxn (2 < = n < = 15). Матрица состоит из нулей и единиц.избежать вычисления всего декартова продукта (python itertools)
В настоящее время я делаю это так:
indices = [[j for j, x in enumerate(row) if x == 1]
for row in self.matrix]
cart = list(itertools.product(*indices))
cart = [list(tup) for tup in cart]
cart = filter(lambda dia: len(list(set(dia))) == len(dia), cart)
return cart
Это прекрасно работает, если матрица не слишком велика, но в остальном он терпит неудачу с: MemoryError
Так есть способ избежать целого вычисление тележки? так что, например, одна перестановка найдена, вычисление прекращается?
Вы создаете несколько копий без причины. Удалите вызов списка на 'itertools.product (* index)' и 'cart = [list (tup) для tup в корзине]' также не нужно. Также фильтр будет медленнее, чем просто делать это с помощью списка comp. –
Почему вы делаете 'list (itertools.product (* index))'? Вы можете легко фильтровать данные лениво. Можете ли вы добавить информацию о используемой версии Python? Python 2.x и 3.x здесь будут немного отличаться. –
Я использую python 2.7. как я могу отфильтровать его лениво? Поскольку у меня есть список индексов в строке, я хочу выбрать один индекс для каждого элемента, как иначе это можно сделать без itertools.product? – ph0t3k