2017-01-02 5 views
2

Ich habe 3 Listen in Python.Entfernen Sie Elemente aus Python-Liste basierend auf Filter

list_a = [10., 20., 30., 12.] 
list_b = [30., 20., 60., 12.] 
list_c = [10., 80., 90., 12.] 

Ich möchte diese Elemente in list_b und list_c wo Werte in list_a fallen <= 15 sind. Daher ergibt sich:

list_b = [20., 60.] 
list_c = [80., 90.] 

Gibt es eine Möglichkeit, diese Schleifen ohne zu tun? (Listenkompromittierungen sind in Ordnung)

+1

Ohne Schleifen? Ich denke nicht. sollte auch nicht 'list_b' sein' [30., 20., 60.,] '? – Prajwal

+0

Eine Schleife - ob explizit wie eine for-Schleife oder implizit wie in einem Listenverständnis - ist notwendig, um die Listen dafür zu durchlaufen. Warum willst du keine Schleife benutzen? – snakecharmerb

+0

Sie benutzen Numpy nicht, oder? Man kann dies leicht mit Numpy-Arrays tun. –

Antwort

4

Sie schreiben kann einen Einzeiler zum Filtern der Liste über mit zip() als:

list_b, list_c = zip(*[(b, c) for a, b, c in zip(list_a, list_b, list_c) if a>15]) 

The final Werte halten von list_b und list_c wird sein:

>>> list_b 
(20.0, 60.0) 
>>> list_c 
(80.0, 90.0) 
1

Können Sie List Comprehensions verwenden?

Man könnte es wie folgt tun:

list_a = [10., 20., 30., 12.] 
list_b = [30., 20., 60., 12.] 
list_c = [10., 80., 90., 12.] 
list_b = [ el for (i, el) in enumerate(list_b) if (list_a[i] > 15) ] 
list_c = [ el for (i, el) in enumerate(list_c) if (list_a[i] > 15) ] 

Snipper hier geschrieben wurde, ich habe es nicht getestet, aber Sie die allgemeine Idee zu sehen.

Ich nahm an, dass alle Listen die gleiche Länge haben. Wenn list_a kürzer ist, und Sie möchten Elemente löschen, die auf die fehlenden Positionen sind, können Sie es wie folgt tun:

list_b = [ el for (i, el) in enumerate(list_b) if (i<len(list_a) and list_a[i] > 15) ] 

und wenn Sie möchten, um sie zu halten, Reverse nur das Zeichen und Booleschen Operator:

list_b = [ el for (i, el) in enumerate(list_b) if (i>=len(list_a) or list_a[i] > 15) ] 
8

Wenn Sie mit numpy wie Sie sagten, Sie sind in den Kommentaren, können Sie einfach einen boolean Index von a und Maskenelemente in b und c erstellen:

import numpy as np 

list_a = np.array([10., 20., 30., 12.]) 
list_b = np.array([30., 20., 60., 12.]) 
list_c = np.array([10., 80., 90., 12.]) 

list_b = list_b[list_a>15] 
list_c = list_c[list_a>15] 

print list_a 
print list_b 
print list_c 
Output

:

[ 10. 20. 30. 12.] 
[ 20. 60.] 
[ 80. 90.] 

Sie können die lists_b und list_c zu Python list type durch .tolist() Methode konvertieren.

6

Sie können die wenig bekannte Klasse itertools.compress verwenden, um dies zu tun. Siehe Filter list using Boolean index arrays

>>> import itertools 
>>> list_a = [10., 20., 30., 12.] 
>>> list_b = [30., 20., 60., 12.] 
>>> list_c = [10., 80., 90., 12.] 
>>> bool_list = [item > 15 for item in list_a] 
>>> bool_list 
[False, True, True, False] 
>>> list_b = list(itertools.compress(list_b, bool_list)) 
>>> list_b 
[20.0, 60.0] 
>>> list_c = list(itertools.compress(list_c, bool_list)) 
>>> list_c 
[80.0, 90.0] 
0
list_a = [10., 20., 30., 12.] 
list_b = [30., 20., 60., 12.] 
list_c = [10., 80., 90., 12.] 
drop = [i for i,v in enumerate(list_a) if v <=15] 
b = [v for i,v in enumerate(list_b) if not i in drop] 
c = [v for i,v in enumerate(list_c) if not i in drop] 
+0

Dies ist keine vollständige Antwort. Bitte fügen Sie auch eine Erklärung für zukünftige Referenz hinzu – Mikkel

1

Sie können zip() wie unten:

>>> list_a = [10., 20., 30., 12.] 
>>> list_b = [30., 20., 60., 12.] 
>>> list_c = [10., 80., 90., 12.] 
>>> 
>>> [j for i,j in zip(list_a, list_b) if i >= 15] 
[20.0, 60.0] 
>>> 
>>> [j for i,j in zip(list_a, list_c) if i >= 15] 
[80.0, 90.0] 
Verwandte Themen