#python #itertools
#python #python-itertools
Вопрос:
Я написал следующий код для вычисления среднего значения сумм, полученных между всеми перестановками списка списков:
import numpy as np
import itertools
r = 13
c = 5
a = np.arange(r*c).reshape(r, c)
a = list(itertools.product(*a))
res = sum([sum(e) for e in a])/len(a)
Происходит сбой кода, поскольку r кажется немного слишком большим, и itertools / python не может с этим справиться. Есть ли какие-либо другие способы вычисления res без сбоя кода?
Комментарии:
1. При сообщении о «сбое кода» , пожалуйста, укажите точную трассировку стека и сообщение об исключении.
2. В любом случае, это выглядит как задача кодирования, которая в конечном итоге вообще не требует никаких итераций. Должна быть возможность вычислить результат непосредственно из
r
иc
.
Ответ №1:
Вы без необходимости собираете сначала products
, а затем отдельные sums
в lists
, когда вы можете с таким же успехом просто повторять итераторы. Вам также не нужен len
список, поскольку вы можете вычислить количество продуктов напрямую.
res = sum(sum(e) for e in itertools.product(*a))/c**r
Это будет потреблять намного меньше памяти, что может уберечь ваш компьютер от зависания или сбоя. Однако для r=13
и c=5
это все еще означает тестирование c**r = 1,220,703,125
комбинаций, что, вероятно, слишком много для Python.
Однако, поскольку вы получаете все продукты, каждый элемент будет появляться во всех продуктах одинаковое количество раз, поэтому вам вообще не нужно фактически вычислять и повторять продукты. Вместо этого вы можете вычислить среднюю сумму произведений непосредственно следующим образом:
res = sum(sum(a)) // c # here, a is the numpy array, not the product iterator
(Это для всех списков, имеющих одинаковое количество элементов; если списки имеют разные размеры, формула будет немного сложнее, но все равно может быть вычислена напрямую, без каких-либо циклов.)