2016-12-06 4 views
-1

Hier sind zwei Funktionen, die (ich dachte) sollte das gleiche tun, aber eigentlich nicht.Index mit Liste Verständnis in einer Liste in Python erhalten

Es scheint, dass mit dem Listenverständnis, der Index, der genommen wird, der erste ist, der entsprechen könnte, also, wenn Sie den gleichen Wert bei unterschiedlichem Index haben, gibt es eine Mehrdeutigkeit.

Gibt es eine Möglichkeit, das Listenverständnis in filter2 zu ändern, damit das gleiche Ergebnis wie in filter1 erhalten?

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

achten Sie in Zukunft auf die kleinen Bits. Was ich meine ist, dass in 'filter1' du' <'zeichen verwendest, in' filter2' du '<=' verwendest. Das Ergebnis ist auch anders, da diese zwei Filter unterschiedliche Logik verwenden, "index" gibt den Wert des ersten gefundenen Index zurück (dort, wo der Fehler liegt). –

Antwort

4

Sie können enumerate als Helfer hier verwenden:

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

enumerate geben Ihnen Paare (index, value), die Sie im Verständnis entpacken
(in i, x). Dann nehmen Sie nur i wenn x <= threshold.

+1

Ich denke, du meinst 'für i, x in enumerate (L)' –

3

Der Grund, warum Sie den Index 7 anstelle von 10 haben, liegt darin, dass Sie doppelte Elemente haben und der Index den kleinsten Index zurückgibt, bei dem der Wert vorhanden ist. Außerdem benötigt die Suche nach dem Index auch eine lineare Zeit. Deine ganze Schleife ist quadratisch.

0

Sie können enumerate verwenden, das die Position der Schleife in i zuweist, x wird mit dem aktuellen Wert zugewiesen.

def filter2(L, threshold=98.7): 
    items = [i for (i, x) in enumerate(L) if x <= 98.7] 
    return items 
Verwandte Themen