Как сравнить пару значений в python, чтобы увидеть, больше ли следующее значение в паре, чем предыдущее?

У меня есть следующий список:

enter image description here

каждая пара значений дает мне информацию об определенной строке. Я хочу иметь возможность сравнивать значения из первой позиции со следующей и смотреть, меньше ли следующее значение, чем текущее значение, если оно сохраняется таким образом, если не удалить эту пару. Так, например, для первого индекса 0 и 1, сравнивая 29 с 25, я вижу, что 25 меньше 29, поэтому я сохраняю пару, теперь я добавляю два к текущему индексу, приводя меня к 16 здесь я вижу, что 16 равно не менее 19, поэтому я удаляю парные значения (16,19). У меня есть следующий код:

curr = 0
skip = 0
finapS = []

while curr < len(apS):
    if distance1[apS[skip+1]] < distance1[apS[skip]]:
        print("its less than prev")
        print(curr,skip)
        finapS.append(distance1[apS[skip]])
        finapS.append(distance1[apS[skip+1]])
        skip = skip + 2
        curr = curr + 1
        print("itterated,", skip, curr)

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

Можете ли вы предоставить данные в текстовом формате (например, в виде отформатированного списка Python)?

BrokenBenchmark 10.04.2022 19:54

Вы увеличиваете curr и skip только тогда, когда условие if истинно

ChatterOne 10.04.2022 19:57
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
33
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Если ваш тест неверен, вы выполняете цикл без увеличения счетчика curr.
Вам нужен

else: 
  curr+=1

(или +=2 по логике)
для продвижения по списку.

Я думаю, что такую ​​логику легче реализовать с помощью генератора. Вы можете перебирать данные и возвращать значения только в том случае, если они соответствуют вашему условию. например

def filter_pairs(data):
    try:
        it = iter(data)
        while True:
            a, b = next(it), next(it)
            if b < a:
                yield from (a, b)
    except StopIteration:
        pass

Пример использования:

>>> aps = [1, 2, 3, 1, 2, 4, 6, 5]
>>> finaps = list(filter_pairs(aps))
>>> finaps
[3, 1, 6, 5]
Ответ принят как подходящий

Говоря о чистом Python, я думаю, что zip — это элегантный способ сделать это в сочетании с шагами среза.

Предполагая, что вы перечисляете как определено как ::

>>> a = [29, 25, 16, 19, 14, 12, 22, 8, 26, 25, 26]

Вы можете заархивировать список сам в себя со сдвигом на единицу и шагом среза на два:

>>> list(zip(a[:-1:2], a[1::2]))
[(29, 25), (16, 19), (14, 12), (22, 8), (26, 25)]

Получив это, вы можете отфильтровать последовательность до нужных вам элементов, ваше полное решение будет:

>>> list((x, y) for (x, y) in zip(a[:-1:2], a[1::2]) if x > y)
[(29, 25), (14, 12), (22, 8), (26, 25)]

Если вы предпочитаете идти по пути numpy, прочитайте о функции np.shift.

Похоже, вам нужен новый список. Поэтому:

apS = [29.12, 25.01, 16.39, 19.49, 14.24, 12.06]
apS_new = []
for x, y in zip(apS[::2], apS[1::2]):
    if x > y:
        apS_new.extend([x, y])
print(apS_new)

Выход:

[29.12, 25.01, 14.24, 12.06]

Другие вопросы по теме