首页 > 解决方案 > 如果值大于 x,则从列表中选择所有值,直到值大于 y。将所有其他值设为 0

问题描述

我想遍历一个值列表。如果存在大于 3 的值,则在该值大于或等于 1 时选择以下所有值(或在低于 1 之前停止)。列表中的其余值应该为零,直到列表中的另一个值大于 3 并且该过程自身重复。

示例:
如果我有以下列表:

l = [1, 3, 2, 3, 2, 4, 1, 3, 5, 6, 7, 6, 7, 8, 1, 0, 1, 2, 1, 3, 4, 7, 8, 9, 7, 5, 2, 1, 2, 4, 7, 8, 1, 3]

我想得到以下信息:

o = [0, 0, 0, 0, 0, 4, 1, 0, 5, 6, 7, 6, 7, 8, 1, 0, 0, 0, 0, 0, 4, 7, 8, 9, 7, 5, 2, 1, 0, 4, 7, 8, 1, 0]

到目前为止,我设法获得了大于 3 和其余 0 的所有值,但我不知道如何整合其他条件:

l = [1, 3, 2, 3, 2, 4, 1, 3, 5, 6, 7, 6, 7, 8, 1, 0, 1, 2, 1, 3, 4, 7, 8, 9, 7, 5, 2, 1, 2, 4, 7, 8, 1, 3] 
o = [0] * len(l)
for index in range(len(l)):
    if l[index] > 3:
        o[index] = l[index]
    else:
        o[index] = 0

输出:

[0, 0, 0, 0, 0, 4, 0, 0, 5, 6, 7, 6, 7, 8, 0, 0, 0, 0, 0, 0, 4, 7, 8, 9, 7, 5, 0, 0, 0, 4, 7, 8, 0, 0]

标签: pythonlistloops

解决方案


我会使用一个标志来控制让哪些值通过。另外,我会使用生成器:

def a_filter(items, on=3, off=1):
    through = False
    for item in items:
        if item > on:
            through = True
        elif item < off:
            through = False
        yield item if through else 0
        if item <= off:
            through = False


l = [1, 3, 2, 3, 2, 4, 1, 3, 5, 6, 7, 6, 7, 8, 1, 0, 1, 2, 1, 3, 4, 7, 8, 9, 7, 5, 2, 1, 2, 4, 7, 8, 1, 3]
o = [0, 0, 0, 0, 0, 4, 1, 0, 5, 6, 7, 6, 7, 8, 1, 0, 0, 0, 0, 0, 4, 7, 8, 9, 7, 5, 2, 1, 0, 4, 7, 8, 1, 0]
print(l)
# [1, 3, 2, 3, 2, 4, 1, 3, 5, 6, 7, 6, 7, 8, 1, 0, 1, 2, 1, 3, 4, 7, 8, 9, 7, 5, 2, 1, 2, 4, 7, 8, 1, 3]
print(o)
# [0, 0, 0, 0, 0, 4, 1, 0, 5, 6, 7, 6, 7, 8, 1, 0, 0, 0, 0, 0, 4, 7, 8, 9, 7, 5, 2, 1, 0, 4, 7, 8, 1, 0]
print(list(a_filter(l)))
# [0, 0, 0, 0, 0, 4, 1, 0, 5, 6, 7, 6, 7, 8, 1, 0, 0, 0, 0, 0, 4, 7, 8, 9, 7, 5, 2, 1, 0, 4, 7, 8, 1, 0]

print(o == list(a_filter(l)))
# True

推荐阅读