Почему мой цикл for пропускает элемент в моем списке?

у меня есть список целых чисел, которые я запускаю через for цикл, чтобы узнать, равны ли два из Объединенных элементов другой переменной t. Так что если t равна 10 и у меня был список intergers: l = [1,2,3,4,5,8,9], то функция должна напечатать все различные комбинации цифр (1,9), (2,8).

я чувствую, что я почти там, но что-то странное происходит со списком, когда я использую

2 ответов


то, что вы пытаетесь сделать, не будет работать, так как вы изменяете список во время его итерации. Скажем, текущий "указатель" указывает на первый элемент. Теперь вы открываете первый, поэтому указатель находится во втором. Но когда цикл продвигается, указатель перемещается на третий, а второй пропускается.

кажется, вы хотите найти комбинации из списка. Есть несколько других способов, которые вы можете попробовать:

  • ближе всего к вашему текущему подходу: используйте while петли вместо for цикл

    while l:
        first = l.pop(0)
        for second in l:
            print(first, second)
    
  • или вы можете просто перебирать индексы вместо самих списков:

    for i in range(len(l)):
        for k in range(i+1, len(l)):
            print(l[i], l[k])
    
  • или просто использовать itertools.combinations

    import itertools
    for first, second in itertools.combinations(l, 2):
        print(first, second)
    

тем не менее, вы можете сделать лучше, чем это. Поскольку вы ищете пару чисел, которые складываются в некоторое целевое число, просто вычитайте первое из целевого числа, чтобы получить второе и посмотреть, находится ли это второе число в список чисел. Используйте set чтобы этот поиск происходил в постоянное время, уменьшая общую сложность времени от O(n2) до O(n).

numbers = set([1,2,5,8,13,15,26,38])
target = 10
for first in numbers:
    second = target - first
    if second > first and second in numbers:
        print(first, second)

вам нужно выбрать другой подход. Вам не разрешается удалять элементы из списка во время итерации по нему с помощью цикла for.