Python теряет путь к индексу в цикле for, когда в моем списке есть повторяющиеся значения - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь перебрать пары целых чисел в списке.Я хотел бы вернуть пары, в которых сумма равна некоторому значению переменной.

Кажется, это работает нормально, когда список целых чисел не имеет повторяющихся чисел.Однако, как только я добавляю повторяющиеся числа в список, цикл, кажется, запутывается, где он находится.Я предполагаю, что это на основании моих заявлений:

print (list.index (item)) print (list.index (item2))

Вот мой код:

working_list = [1,2,3,4,5]
broken_list =  [1,3,3,4,5]

def find_pairs(list, k):
  pairs_list = []
  for item in list:
    for item2 in list:
      print(list.index(item))
      print(list.index(item2))
      if list.index(item) < list.index(item2):
        sum = item + item2;
        if sum == k:
          pair = (item, item2)
          pairs_list.append(pair)
  return pairs_list  


### First parameter is the name is the list to check.
### Second parameter is the integer you're looking for each pair to sum to.
find_pairs(broken_list, 6)  

working_list в порядке.Когда я запускаю broken_list в поисках пар, сумма которых равна 6, я возвращаюсь (1,5), но я также должен возвращаться (3,3), а я нет.

1 Ответ

1 голос
/ 24 июня 2019

Вы пытаетесь использовать 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, и поэтому использовать их как имена переменных - это плохой стиль,Кроме того, «элементы» обычно используются для ссылки на пару объектов «ключ-значение», и поэтому я бы воздержался от использования этого имени и для одного значения (я думаю, что-то вроде «элемента» более подходит).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...