Как найти и заменить значения интервала в списке? - PullRequest
1 голос
/ 21 апреля 2020

У меня есть такой список:

list_1 = [1, 2, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, 1, 2, 3, 1, 1, 2, 3, 4, 1]

В этом списке значение сразу после 4 больше или меньше самого 4. Более конкретно, меньшее значение всегда 1. Значения интервала от этого 1 до следующего 1 всегда меньше 4.

Как найти и заменить значение такого интервала, например, как следующее:

list_2 = [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, 0, 0, 0, nan, nan, nan, nan, nan, nan, nan, 0]

1, 2, 1 заменяется, потому что первый 1 расположен сразу после него и меньше 4. Таким образом, интервал от этого первого 1 до второго 1 заменяется.

Другие значения не должны быть nan, я просто выделю замены. Для ясности, если значение сразу после 4 будет пропущено.

Ответы [ 3 ]

1 голос
/ 21 апреля 2020
list1 = [1, 2, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, 1, 2, 3, 1, 1, 2, 3, 4, 1]
list2 = []
i = 0
while i != len(list1):
    if list1[i] == 4:
        list2.append("nan")
        if list1[i+1] > 4:
            list2.append("Superior to 4 after a 4")
            i+=1
        else:
            list2.append("nan")
            i+=1
    else:
        list2.append("nan")
    i += 1
print(list2)

Код не оптимизирован, но будет иметь значение «nan», если соответствующее значение не превосходит 4 после 4, и будет «лучше 4 после 4», если оно равно.

1 голос
/ 21 апреля 2020

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

это код:

import numpy as np
list_1 = np.array([1, 2, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 1, 2, 1, 2, 3, 1, 1, 2, 3, 4, 1])

modified_list_1 = np.append(list_1,1) # to always have a "next 1"

idx_of_4 = np.where(modified_list_1==4)[0]
idx_of_1 = np.where(modified_list_1==1)[0]

idx_of_4_followed_by_1 = np.intersect1d(idx_of_4, idx_of_1-1)

arr_slice_idx = [(start, np.min(idx_of_1[idx_of_1>(start+1)])) for start in idx_of_4_followed_by_1]

for start,end in arr_slice_idx:
  list_1[start+1:end+1] = 0

print(list_1)

Я начинаю с нахождения индексов 4 с, а затем 1 с, используя np.where и np.intersect1d , который векторизован и должен работать очень быстро
К сожалению, здесь у меня кончилось вдохновение, и для поиска «следующего 1», который закрывает каждый диапазон, я использовал обычное (довольно уродливое) понимание.

Затем, когда у меня есть начало и конец, я использую их, чтобы нарезать исходный массив и установить значение 0.

1 голос
/ 21 апреля 2020

В качестве опции:

for i in range(len(list_1)): # looking at all the elements in the list in order.
    if a[i]==4: # if the number with "i" index equals to "4"
        if a[i+1] > 4: # if the number after 4 is greater than 4
            a[i+1] == nan # the number after 4 equals "nan"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...