Список в Python избегать только первого отрицательного элемента

1

Я пытаюсь сравнить числа из файла numbers.txt. Меня беспокоит свойство отрицательного индекса в Python, где отрицательное число фактически означает чтение справа налево.

Есть ли способ игнорировать только первое сравнение? Когда я выводю, что предыдущего номера нет (см. Желаемый вывод)

Важно то, что я не могу изменить файл numbers.txt. Они автоматически генерируются из другой функции.

$ cat numbers.txt

1
2
3
4
5

код:

with open('numbers.txt') as file:
    lines = file.read().splitlines()
    print lines
    for i in range(len(lines)):
        previous_number = lines[i-1]
        current_number = lines[i]
        print "current Nr: ", current_number
        print "previous Nr: ", previous_number
        if current_number > previous_number:
            print " current Nr is larger"
        else:
            print "current Nr is smaller"

выход:

['1', '2', '3', '4', '5']
current Nr:  1
previous Nr:  5
current Nr is  smaller
current Nr:  2
previous Nr:  1
 current Nr is larger
current Nr:  3
previous Nr:  2
 current Nr is larger
current Nr:  4
previous Nr:  3
 current Nr is larger
current Nr:  5
previous Nr:  4
 current Nr is larger

желаемый выход

['1', '2', '3', '4', '5']
current Nr:  1
previous Nr:  There is no previous!
current Nr is  none
current Nr:  2
previous Nr:  1
 current Nr is larger
current Nr:  3
previous Nr:  2
 current Nr is larger
current Nr:  4
previous Nr:  3
 current Nr is larger
current Nr:  5
previous Nr:  4
 current Nr is larger
  • 2
    Позвольте мне, пожалуйста, здесь заявить, что ваш вопрос не имеет ничего общего с индексацией Python, поскольку вы даже не пытаетесь реализовать случай, когда вы хотите напечатать «Предыдущего нет!». Если python не предоставит отрицательные индексы, ваша программа выдаст ошибку. Итак, мой совет: забудьте об индексе -1 и подумайте, что вы должны добавить в свой цикл, чтобы поймать первый случай, который отличается от других ...
  • 0
    Чего вы на самом деле пытаетесь достичь? Вам действительно нужен именно этот вывод, или вы хотите перебрать список в соседних парах?
Показать ещё 4 комментария
Теги:
list
indexing
ignore

3 ответа

2
Лучший ответ

Вы можете использовать enumerate для проверки по индексу

for i, value in enumerate(lines):
  previous_number = "None"
  CurrentNrText = "None"
  if i != 0:
    previous_number = lines[i-1]
    if current_number > previous_number:
       CurrentNrText = " current Nr is larger"
     else:
       CurrentNrText = "current Nr is smaller"

  current_number = lines[i]
  print("current Nr: ", current_number)
  print("previous Nr: ", previous_number)
  print(CurrentNrText)
  • 0
    Это также работает, но игнорирует первый элемент как текущий Nr. Я бы предпочел получить текущий номер. как 1 и обнаружить, что перед ним нет номера ...
  • 0
    Я отредактировал код для более подробной информации. Вы просто должны были отредактировать код, основываясь на условии. в любом случае это сделано в редактировании сейчас
Показать ещё 1 комментарий
1

Вы можете попробовать этот метод:

with open('numbers.txt') as file:
    numbers=[None,]
    for line in file:
        numbers.append(line)
    for idx,no in enumerate(numbers,1):
        try:

            if numbers[idx]>numbers[idx-1]:
                print('Current no is {}'.format(numbers[idx]))
                print('Previous no is {}'.format(numbers[idx-1]))
                print ("current Nr is larger")
            else:
                print ("current Nr is smaller")
        except TypeError:
            print('Current no is {}'.format(numbers[idx]))
            print('There is no previous!')
        except IndexError:
            pass

выход:

Current no is 1

There is no previous!
Current no is 2

Previous no is 1

current Nr is larger
Current no is 3

Previous no is 2

current Nr is larger
Current no is 4

Previous no is 3

current Nr is larger
Current no is 5
Previous no is 4

current Nr is larger
1

Если вы хотите начать со второго номера, то явно начинайте со второго номера:

for i in range(1, len(lines)):

Или, еще лучше, используйте более идиоматических enumerate:

for i, number in enumerate(lines[1:], 1):
  • 0
    Это работает, но не совсем. В этом случае я просто игнорирую первый элемент как текущий Nr. Я бы предпочел получить текущий номер. как 1 и обнаружить, что перед ним нет номера. Тот первый элемент, который определяется как текущий Nr, важен.
  • 0
    @Lango Так что просто добавьте условие if, которое проверяет, равен ли i == 0 вашему текущему коду. Я не вижу, где проблема
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню