Вы пытаетесь использовать list.index(item) < list.index(item2)
, чтобы избежать двойного счета пар.Однако broken_list.index(3)
возвращает 1
для первого и второго 3
в списке.Т.е. возвращаемое значение равно , а не фактическому индексу, который вы хотите (если только список не содержит только уникальные элементы, такие как working_list
).Чтобы получить фактический индекс, используйте enumerate
.Простейшей реализацией было бы
def find_pairs(list, k):
pairs_list = []
for i, item in enumerate(list):
for j, item2 in enumerate(list):
if i < j:
sum = item + item2
if sum == k:
pair = (item, item2)
pairs_list.append(pair)
return pairs_list
Для небольших списков это хорошо, но мы могли бы быть более эффективными, только зацикливаясь на элементах, которые мы хотим, используя нарезку, следовательно, исключая оператор if:
def find_pairs(list, k):
pairs_list = []
for i, item in enumerate(list):
for item2 in list[i+1:]:
sum = item + item2
if sum == k:
pair = (item, item2)
pairs_list.append(pair)
return pairs_list
Примечание к именам переменных
Наконец, я должен прокомментировать ваш выбор имен переменных: list
и sum
уже определены в Python, и поэтому использовать их как имена переменных - это плохой стиль,Кроме того, «элементы» обычно используются для ссылки на пару объектов «ключ-значение», и поэтому я бы воздержался от использования этого имени и для одного значения (я думаю, что-то вроде «элемента» более подходит).