Выбор элементов из списка в соответствии с заданными условиями - PullRequest
0 голосов
/ 14 мая 2019

Мне нужно запустить список и удалить все элементы, которые не удовлетворяют определенным условиям. В частности, каждый раз, когда у меня есть два последовательных элемента A и B, где A отрицательно, а B положительно (все элементы отличны от нуля), и отношение этих элементов меньше некоторого заданного отношения, их следует удалить. Все остальные элементы должны остаться.

Сначала я просматривал список и удалял напрямую. Однако, поскольку я просматривал длину списка, а цикл фактически менял эту длину, у меня были ошибки индекса. Поэтому я решил, что я бы просто создал новый список со всеми элементами, которые ДЕЙСТВИТЕЛЬНО удовлетворяют условиям, вместо того, чтобы удалять Это правильный подход? Вот мой код:

d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
for i in range(0, len(d_list) - 1):
    if ((d_list[i] < 0) & (d_list[i+1] > 0)):
        if(math.fabs(d_list[i+1] / d_list[i]) >= 6/5):
            J.append(d_list[i])
            J.append(d_list[i+1])
    else:
        J.append(d_list[i])

Я должен иметь в качестве вывода: [1, -24, 29].

Однако я получаю: [1, 7, 11, 13, 17, 19, 23, -24, 29, 29].

Я очень запутался и попробовал несколько вариантов кода, который я показал выше, но безуспешно.

1 Ответ

1 голос
/ 14 мая 2019

Вот, пожалуйста:

import math

d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
skip = []

for i in range(0, len(d_list) - 1):
    if i in  skip:
        continue
    if d_list[i] < 0 < d_list[i+1]:
        if math.fabs(d_list[i+1] / d_list[i]) >= 6/5:
            J.append(d_list[i])
        else:
            skip.append(i+1)

    else:
        print(d_list[i])
        J.append(d_list[i])

print(J)

Output:[1, -24,-29]

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

A->B->C

Если произойдет сбой A-> B, вы должны удалить их оба, и ваш код пропустит A, а затем проверит, действительны ли они B-> C, поэтому вы добавляете их обоих, и не должны.

Надеюсь, это понятно, если вы хотите, я могу уточнить подробнее.

Edit: Вы также можете сделать это, не пропуская список, просто используя значение bool:

import math

d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
skip = False
for i in range(0, len(d_list) - 1):
    if skip:
        skip = False
        continue
    if d_list[i] < 0 < d_list[i+1]:
        if math.fabs(d_list[i+1] / d_list[i]) >= 6/5:
            J.append(d_list[i])
        else:
            skip =True

    else:
        print(d_list[i])
        J.append(d_list[i])

print(J)

Output:[1, -24,-29]

Однако при первом подходе сохраняется информация, почему элемент был удален.

...