我编写此脚本是为了迭代数组,并且仅保留数字在 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)
我尝试在不创建重复列表的情况下执行此操作,但这是在从输出列表中删除项目时拥有参考列表的唯一方法。此外,当我在当前值之前测试值时,迭代已经测试过的值似乎是多余的,但我觉得这会让它更加复杂并且容易出错。总的来说,我不确定如何让它不那么笨重,但我确信这是可能的。任何建议将不胜感激!
试试这个:
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)