【问题标题】:Picking elements from a list according to given conditions根据给定条件从列表中挑选元素
【发布时间】:2019-05-13 22:02:43
【问题描述】:

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

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

【问题讨论】:

  • &amp; 更改为and。前者是位运算符
  • 还有,什么版本的python?

标签: python list list-manipulation


【解决方案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]

但是,第一种方法保留了元素被删除的原因信息。

【讨论】:

  • 谢谢。我应该注意,输入序列不一定像我给出的示例中那样是交替符号。这种方法应该适用于一般输入序列吗?
  • @jonan 如果排除规则没有改变,它将起作用。主要问题是您没有跳过在先前迭代中不符合条件的元素。因此,如果索引元素i 失败i+1 也失败,则需要将其省略,并且检查应在i+2 处恢复。从ii+2 会有效地删除ii+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多