2016-12-06 14 views
-1

(私は思った)同じことをするべきだが実際はしないという2つの方法があります。リストの理解の指標をPythonのリストで取得する

リストの理解では、取り込まれたインデックスが最初に対応すると思われるので、異なるインデックスに同じ値がある場合、あいまいさがあります。

リストの理解度をfilter2に変更する方法はありますか?filter1と同じ結果が得られますか?

L = [98.75011926342906, 
97.8178200008178, 
98.6138182016438, 
98.55520874507613, 
98.25262038791283, 
98.75011926342906, 
99.06770073738875, 
98.66970163697574, 
98.56611283001895, 
98.47751713985852, 
98.66970163697574, 
97.8178200008178] 


def filter1(L, threshold=98.7): 
    items = [] 
    for i in range(len(L)): 
     if L[i] < threshold: 
      items.append(i) 
    return items 

def filter2(L, threshold=98.7): 
    items = [L.index(x) for x in L if x <= threshold] 
    return items 

print filter1(L) 
>>> [1, 2, 3, 4, 7, 8, 9, 10, 11] 
print filter2(L) 
>>> [1, 2, 3, 4, 7, 8, 9, 7, 1] 
+0

今後は小さなビットに注意してください。つまり、 'filter1'では' <'を使い、' filter2'では '<='を使います。これらの2つのフィルタが異なるロジックを使用しているため、結果も異なります。「index」は見つかった最初のインデックスの値を返します(つまり、欠陥がある場所)。 –

答えて

4

あなたはここにヘルパーとしてenumerateを使用することができます。

bad_items = [i for i, x in enumerate(L) if x <= threshold] 

enumerateは、あなたが(i, xに)理解
に解凍することができます(index, value)のペアを与えるだろう。 x <= thresholdの場合は、iのみとなります。

+1

私はあなたが 'のために、xを列挙する(L)'を意味すると思います。 –

3

重複した要素がありインデックスが値の存在する最小のインデックスを返すため、10ではなく7のインデックスがある理由があります。また、インデックスの検索にも線形時間がかかります。あなたの全体のループは二次的です。

0

ループの位置をiに割り当てるenumerateを使用できます。xには現在の値が割り当てられます。

def filter2(L, threshold=98.7): 
    items = [i for (i, x) in enumerate(L) if x <= 98.7] 
    return items 
関連する問題