Python - заполнить пробел между двумя значениями в списке вторым значением - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть список вроде этого

lst = ['a','a','a','X','y','y','y','a','a','y','y','a','a','a','a','a','a','X','y','a','y','a','y','y','y','a','a','a','a']

Миссия состоит в том, чтобы получить этот вывод

lst = ['a','a','a','X','y','y','y','y','y','y','y','a','a','a','a','a','a','X','y','y','y','y','y','y','y','a','a','a','a']

Объясните: просто найдите X и последний y перед следующим X, а затемзаменить значения а между ними на у.Если в конце нет следующего X, то рассмотрим последний y.

Я попытался найти индексы начала и конца

starts = [i for i, x in enumerate(lst) if x == 'X']

[3, 17]

ends = [i for i, x in enumerate(lst) if x == 'y']

[4, 5, 6, 9, 10, 18, 20, 22, 23, 24]

и затем цикл начинается, чтобы найти числа между 3,17 в концах, изатем возьмите максимум и замените от 3 до максимума, который в данном случае равен 10.И так далее.

Вопрос в том, что может быть лучше, чем этот?

1 Ответ

0 голосов
/ 06 декабря 2018

Вы можете сделать что-то вроде этого:

def fill_gap(l, pivot='X', target='a', fill='y'):
    result = l[:]
    X_indices = [i for i, e in enumerate(l) if e == pivot] + [len(l)] # find the indices of pivot
    for start, end in zip(X_indices, X_indices[1:]): # iterate over the slices from the indices of pivot
        segment = l[start + 1:end]
        try:
            ye = len(segment) - 1 - segment[::-1].index(fill) # find the las appearance of fill if exists 
            for j, e in enumerate(segment):
                if e == target and j < ye: # if equals target and if before the last appearance of fill
                    result[start + 1 + j] = 'y'
        except ValueError:
            continue

    return result


lst = ['a', 'a', 'a', 'X', 'y', 'y', 'y', 'a', 'a', 'y', 'y', 'a', 'a', 'a', 'a', 'a', 'a', 'X', 'y', 'a', 'y', 'a',
       'y', 'y', 'y', 'a', 'a', 'a', 'a']
print(fill_gap(lst))
print(fill_gap(['X', 'a', 'y']))
print(fill_gap(['X', 'a', 'y', 'a', 'X', 'a', 'y']))

Вывод

['a', 'a', 'a', 'X', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'a', 'a', 'a', 'a', 'a', 'a', 'X', 'y', 'y', 'y', 'y', 'y', 'y', 'y', 'a', 'a', 'a', 'a']
['X', 'y', 'y']
['X', 'y', 'y', 'a', 'X', 'y', 'y']

Обратите внимание, что функция fill_gap возвращает новый список (result), но это можно легко изменить, изменив список на месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...