python - 如果值大于 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]
解决方案
我会使用一个标志来控制让哪些值通过。另外,我会使用生成器:
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
推荐阅读
- css - CSS:获取给定类的最后一个 HTML 标记,在一个列表中,不是每个 HTML 标记都有这个类
- android - 在 tablayout 片段之间进行通信
- tensor - GAM 包中的张量积 ti() 给出不正确的结果
- javascript - 如何将数据发布到 JsonPlaceholder 假服务器?
- ajax - Ajax 错误 500:检测到循环引用
- android - 执行颤振应用程序时出错
- c - 在 SPI STM32 中读取 Rx 缓冲区的问题
- angularjs - 如何使用 ag-grid 在多列中创建 OR 逻辑过滤器
- c# - C# Dictionary 获取具有相同值的所有键
- java - CompletableFuture.supplyAsync 代码的代码覆盖率