0

リストを実行し、特定の条件を満たさないすべての要素を削除する必要があります。具体的には、2 つの連続する要素 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]

私は非常に混乱しており、上に示したコードのいくつかのバリエーションを試しましたが、成功しませんでした。

4

1 に答える 1

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]

問題は、1 つではなく両方の要素を追加していることです。要素が無効な場合は、条件に既に失敗しているため、次のチェックでスキップする必要があります。たとえば、

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]

ただし、最初のアプローチでは、要素が削除された理由に関する情報が保持されます。

于 2019-05-13T22:24:51.373 に答える