Непосредственная проблема заключается в том, что вы используете ls.index
, чтобы найти, где начать внутренний цикл. list.index
возвращает индекс первого соответствующего элемента, поэтому будет делать только то, что вам нужно, если в списке нет дубликатов. Другая проблема заключается в том, что он выполняет линейный поиск в вашем списке для каждой итерации внешнего цикла, что делает ваш алгоритм излишне неэффективным.
Доступен ряд обходных путей. Простым является использование enumerate
для указания нужного индекса:
sum(n * ls[j] for i, n in enumerate(ls) for j in range(i + 1, len(ls)))
Или вы можете использовать пару объектов range
:
sum(ls[i] * ls[j] for i in range(len(ls)) for j in range(i + 1, len(ls)))
Создание range
обычно дешевле, чем копирование всего подсписка каждый раз, как с
sum(x * y for i, x in enumerate(ls) for y in ls[i + 1:])
В качестве альтернативы, вы можете использовать itertools.combinations
, чтобы сгенерировать значения для вас более эффективно:
sum(x * y for x, y in itertools.combinations(ls, 2))