根据给定条件从列表中挑选元素
Picking elements from a list according to given conditions
我需要 运行 遍历一个列表,并删除所有不满足特定条件的元素。具体来说,每次我有两个连续的元素 A 和 B,其中 A 为负,B 为正(所有元素都非零),并且这些元素的比率小于某个给定比率时,它们应该被删除。所有其他元素都应该保留。
起初,我是循环遍历列表,然后直接删除。但是,由于我正在遍历列表的长度,并且循环实际上正在改变这个长度,所以我遇到了索引错误。所以我想我会制作一个包含所有满足条件的元素的新列表,而不是删除。这是正确的方法吗?这是我的代码:
d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
for i in range(0, len(d_list) - 1):
if ((d_list[i] < 0) & (d_list[i+1] > 0)):
if(math.fabs(d_list[i+1] / d_list[i]) >= 6/5):
J.append(d_list[i])
J.append(d_list[i+1])
else:
J.append(d_list[i])
我应该有输出:[1, -24, 29]
。
但是我得到:[1, 7, 11, 13, 17, 19, 23, -24, 29, 29]
。
我非常困惑,尝试了上面显示的代码的几种变体,但都没有成功。
给你:
import math
d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
skip = []
for i in range(0, len(d_list) - 1):
if i in skip:
continue
if d_list[i] < 0 < d_list[i+1]:
if math.fabs(d_list[i+1] / d_list[i]) >= 6/5:
J.append(d_list[i])
else:
skip.append(i+1)
else:
print(d_list[i])
J.append(d_list[i])
print(J)
Output:[1, -24,-29]
问题是您附加了两个元素而不是一个元素,如果元素无效,您应该在下一次检查中跳过它,因为它已经不符合条件。例如我们有
A->B->C
如果 A->B 失败,您应该将它们都删除,并且您的代码省略了 A,然后检查 B->C 是否有效,因此您将它们都添加,但不应该。
如果您希望我能详细说明,我希望这是清楚的。
编辑:
您也可以在不跳过列表的情况下仅使用 bool 值,如下所示:
import math
d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
skip = False
for i in range(0, len(d_list) - 1):
if skip:
skip = False
continue
if d_list[i] < 0 < d_list[i+1]:
if math.fabs(d_list[i+1] / d_list[i]) >= 6/5:
J.append(d_list[i])
else:
skip =True
else:
print(d_list[i])
J.append(d_list[i])
print(J)
Output:[1, -24,-29]
但是,第一种方法保留了删除元素的原因的信息。
我需要 运行 遍历一个列表,并删除所有不满足特定条件的元素。具体来说,每次我有两个连续的元素 A 和 B,其中 A 为负,B 为正(所有元素都非零),并且这些元素的比率小于某个给定比率时,它们应该被删除。所有其他元素都应该保留。
起初,我是循环遍历列表,然后直接删除。但是,由于我正在遍历列表的长度,并且循环实际上正在改变这个长度,所以我遇到了索引错误。所以我想我会制作一个包含所有满足条件的元素的新列表,而不是删除。这是正确的方法吗?这是我的代码:
d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
for i in range(0, len(d_list) - 1):
if ((d_list[i] < 0) & (d_list[i+1] > 0)):
if(math.fabs(d_list[i+1] / d_list[i]) >= 6/5):
J.append(d_list[i])
J.append(d_list[i+1])
else:
J.append(d_list[i])
我应该有输出:[1, -24, 29]
。
但是我得到:[1, 7, 11, 13, 17, 19, 23, -24, 29, 29]
。
我非常困惑,尝试了上面显示的代码的几种变体,但都没有成功。
给你:
import math
d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
skip = []
for i in range(0, len(d_list) - 1):
if i in skip:
continue
if d_list[i] < 0 < d_list[i+1]:
if math.fabs(d_list[i+1] / d_list[i]) >= 6/5:
J.append(d_list[i])
else:
skip.append(i+1)
else:
print(d_list[i])
J.append(d_list[i])
print(J)
Output:[1, -24,-29]
问题是您附加了两个元素而不是一个元素,如果元素无效,您应该在下一次检查中跳过它,因为它已经不符合条件。例如我们有
A->B->C
如果 A->B 失败,您应该将它们都删除,并且您的代码省略了 A,然后检查 B->C 是否有效,因此您将它们都添加,但不应该。
如果您希望我能详细说明,我希望这是清楚的。
编辑: 您也可以在不跳过列表的情况下仅使用 bool 值,如下所示:
import math
d_list = [1, -6, 7, -10, 11, -12, 13, -15, 17, -18, 19, -20, 23, -24, 29, -30, 31]
J = []
skip = False
for i in range(0, len(d_list) - 1):
if skip:
skip = False
continue
if d_list[i] < 0 < d_list[i+1]:
if math.fabs(d_list[i+1] / d_list[i]) >= 6/5:
J.append(d_list[i])
else:
skip =True
else:
print(d_list[i])
J.append(d_list[i])
print(J)
Output:[1, -24,-29]
但是,第一种方法保留了删除元素的原因的信息。