Предположим, у меня есть список тяжелых объектов, для аргументов рассмотрим x = numpy.arange(10)/10
x = numpy.arange(10)/10
Я создал генератор с помощью gen = itertools.product(x,x), чтобы выполнить некоторые вычисления. Дело в том, что мои вычисления симметричны c: для всех i и j, heavy_calc(x[i],x[j]) = heavy_calc(x[j],x[i]).
gen = itertools.product(x,x)
i
j
heavy_calc(x[i],x[j]) = heavy_calc(x[j],x[i])
Следовательно, я хочу вычислить только верхнюю часть матрицы. Как я могу заставить генератор возвращать (x[i], x[j]) только если i >= j?
(x[i], x[j])
i >= j
Я бы построил генератор вручную :
def gen(x): for i in range(len(x)): for y in x[i:]: yield(x[i], y)
Это дает, как и ожидалось:
>>> list(gen(list(range(4)))) [(0, 0), (0, 1), (0, 2), (0, 3), (1, 1), (1, 2), (1, 3), (2, 2), (2, 3), (3, 3)]
Используйте itertools.combinations_with_replacement вместо product:
itertools.combinations_with_replacement
product
gen = itertools.combinations_with_replacement(x, 2)
Обратите внимание, что это дает (x[i], x[j]) кортежей с i <= j, а не i >= j. Это должно быть хорошо для вашего случая использования.
i <= j