Python用第二个值填充列表中两个值之间的间隙

2024-04-19 06:47:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的单子

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']

我们的任务是得到这个输出

^{pr2}$

解释:简单地说,在下一个X之前找到X和最后一个y,然后用y替换中间的a值。如果末尾没有下一个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。等等。

问题是还有比这更好的方法吗?


Tags: 方法inforif数字单子末尾lst
1条回答
网友
1楼 · 发布于 2024-04-19 06:47:35

你可以这样做:

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']))

输出

^{pr2}$

注意,函数fill_gap返回一个新的列表(result),但这可以很容易地更改为就地修改列表。在

相关问题 更多 >