Повторный вызов num.index
очень неэффективен.Каждый раз, когда вы находите номер, который удовлетворяет вашему условию, вызов index
требует последовательного сканирования списка.
Вместо этого переверните цикл над индексами в списке.Сделайте сравнение, проиндексировав массив (произвольный доступ), который будет намного более эффективным.
Как уже отмечали другие, вы можете использовать itertools.product
, но вместо продукта num
с самим собой, сделайтесам продукт range(len(num))
.
Использование map
и filter
:
from operator import itemgetter
from itertools import product
res = map(
itemgetter(0),
filter(
lambda c: num[c[0]]+num[c[1]] == tgt,
product(range(len(num)),range(len(num)))
)
)
print(list(res))
#[0, 1, 2, 4, 6, 7]
Внутренний filter
фильтрует все пары чисел от 0 до длины num
минус одна, для которойзначения в num
при тех соответствующих индексах равны цели.Поскольку product возвращает пару индексов, и вас интересует только первое значение, map
- результат filter
с itemgetter(0)
для получения первого элемента.
Более компактно в качестве понимания списка:
[i for i, j in product(range(len(num)), range(len(num))) if num[i] + num[j] == tgt]