根据给定条件从列表中选择元素

时间:2019-05-13 22:02:44

标签: python list list-manipulation

我需要遍历一个列表,并删除所有不满足某些条件的元素。具体来说,每当我有两个连续的元素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]

我非常困惑,并且尝试了上面显示的代码的几种变体,但是没有成功。

1 个答案:

答案 0 :(得分:1)

您在这里:

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]

但是,第一种方法保留有关为何删除元素的信息。