优化此代码,如果值匹配给定范围,则将值保留在数组中,并且附近的值也匹配给定范围,删除所有其他值

问题描述 投票:0回答:1

我编写此脚本是为了迭代数组,并且仅保留数字在 40 到 60 之间的值,并且前三个或后三个值也在 40 到 60 之间。该代码执行了预期的操作,但看起来很笨拙而且效率低下。有更好的写法吗?

my_list = [0, 10, 20, 30, 40, 50, 52, 51, 49, 56, 44, 60, 70, 80, 55, 90]

output_list = list(my_list)
n = 0
for index, value in enumerate(my_list):
    if not 40 < value < 60: 
        output_list.pop(index-n)
        n+=1
    else: 
        a_count = 0
        b_count = 0
        for i in range(3):
            try: 
                if 40 < my_list[index + i + 1] < 60: 
                    a_count += 1
            except IndexError: 
                pass
            try: 
                if 40 < my_list[index - i - 1] < 60: 
                    b_count += 1
            except IndexError: 
                pass
        if a_count != 3 and b_count != 3: 
            output_list.pop(index-n)
            n+=1

print(output_list)

我尝试在不创建重复列表的情况下执行此操作,但这是在从输出列表中删除项目时拥有参考列表的唯一方法。此外,当我在当前值之前测试值时,迭代已经测试过的值似乎是多余的,但我觉得这会让它更加复杂并且容易出错。总的来说,我不确定如何让它不那么笨重,但我确信这是可能的。任何建议将不胜感激!

python arrays optimization filtering
1个回答
0
投票

试试这个:

my_list = [0, 10, 20, 30, 40, 50, 52, 51, 49, 56, 44, 60, 70, 80, 55, 90]

output_list = [value for index, value in enumerate(my_list) if 40 < value < 60]

for index, value in enumerate(output_list):
    a_count = sum(40 < my_list[i] < 60 for i in range(index, index + 4))
    b_count = sum(40 < my_list[i] < 60 for i in range(index, index - 4, -1))
    
    if a_count != 3 and b_count != 3:
        output_list[index] = None

output_list = [value for value in output_list if value is not None]
print(output_list)
© www.soinside.com 2019 - 2024. All rights reserved.