Как ограничить количество итераций вложенного цикла for только в тех случаях, когда счетчики цикла отличаются? - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь написать простую программу, которая может идентифицировать списки в «списке списков», которые имеют одинаковый «нулевой» элемент.

Моя попытка ниже.

Поскольку моя конструкция рассматривает случаи, когда, например, я = 0, j = 1 и i = 1, j = 0, чтобы отличаться, я заканчиваю печатать вдвое больше списков, чем мне нужно.

Я знаю, что могу использовать list (set (indices_of_repeats)), чтобы удалить дубликаты, но это на самом деле напрямую не решает основную проблему, а именно то, что я хочу понять, как поместить условие в значения, которые мой цикл счетчики (это правильная терминология?) берутся относительно друг друга и не удосуживаются перебирать случаи, когда это условие не выполняется.

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

list = [[1,2], [2,3], [4,5], [4,6],[4,7]]

indices_of_repeats = []
for i in range(0,len(list)):
    for j in range(0,len(list)):
        if list[i][0] == list[j][0] and i !=j:
            indices_of_repeats.append(list[i])
print (indices_of_repeats)

EDIT:

Я придумал следующее - это работает, но любые лучшие предложения приветствуются.

list = [[4,5],[1,2], [2,3], [4,6],[4,7]]
repeats = []
  for i in range(len(list)):
      for j in range(len(list)):
          if list[i][0] == list[j][0] and i!=j:
              repeats.append(list[i])
              break
print (repeats)

Ответы [ 2 ]

0 голосов
/ 25 апреля 2019

Вот простое решение с дополнительным условием в if.Это неэффективно, но, похоже, вам не нужно обрабатывать тысячи элементов.

list = [[1,2], [2,3], [4,5], [4,6],[4,7]]

indices_of_repeats = []
for i in range(0,len(list)):
    for j in range(0,len(list)):
        if list[i][0] == list[j][0] and i !=j and list[i] not in indices_of_repeats:
            indices_of_repeats.append(list[i])
print (indices_of_repeats)
0 голосов
/ 25 апреля 2019

Это просто, так как вам нужен только один экземпляр каждой комбинации. Просто запустите свой внутренний счетчик цикла выше внешнего:

for i in range(0, len(list)):
    for j in range(i+1, len(list)):
        if list[i][0] == list[j][0]:
            indices_of_repeats.append(list[i])

Выход:

[(2, 3), (2, 4), (3, 4)]

Это индексы пар с совпадающими первыми элементами. [[4, 5], [4, 5], [4, 6]]

Это не особенно наглядно: вы печатаете первый элемент соответствующей пары в каждом случае. Я подозреваю, что вам нужно что-то лучше, например, пары индексов:

            indices_of_repeats.append( (i, j) )
...