2016-08-18 4 views
3

ich eine boolean Liste haben, sagen:Convert boolean in Integer Lage in Python

x = [True, False, False, True] 

Wie Sie diese Liste konvertieren Standorte in Integer, so dass Sie das Ergebnis:

y = [1, 4] 

?

+1

Beachten Sie, dass das ist ein 'list' eher als ein' array': "Array" hat eine andere Bedeutung als die meisten Python-Benutzer (und insbesondere NumPy-Benutzer). –

+0

Danke dafür! – J4y

+0

Angesichts der R-Fragen und der Cross Validated-Aktivität in Ihrem Profil werden Sie wahrscheinlich besser von einem Array bedient als von einer Liste. – user2357112

Antwort

10

Sie eine Liste Verständnis in Kombination mit der enumerate Funktion zum Beispiel verwenden:

>>> x = [True, False, False, True] 
>>> [index for index, element in enumerate(x, start=1) if element] 
[1, 4] 

Alternativ, wenn Sie bereit sind, NumPy zu verwenden und ein Ergebnis vom Typ numpy.ndarray, bekommt es gibt eine NumPy Funktion, (fast) macht was du brauchst: numpy.where.

>>> import numpy 
>>> numpy.where(x) 
(array([0, 3]),) 
>>> numpy.where(x)[0] + 1 
array([1, 4]) 

Die seltsamen [0] in der Zeile darüber ist da, weil numpy.where immer seine Ergebnisse in einem Tupel zurück: ein Element des Tupels für jede Dimension des Eingangsfeldes. Da in diesem Fall das Eingabearray eindimensional ist, interessieren wir uns nicht wirklich für die äußere Tupelstruktur, daher verwenden wir die Indizierungsoperation [0], um das tatsächliche Array herauszuziehen, das wir brauchen. Die + 1 gibt es von Python/NumPy Standard-0-basierte Indizierung auf die 1-basierte Indizierung, dass es aussieht, als ob Sie hier möchten.

Wenn Sie mit großen Eingabedaten arbeiten (und insbesondere wenn die Eingabeliste bereits in Form eines NumPy-Arrays vorliegt), ist die NumPy-Lösung wahrscheinlich wesentlich schneller als das Listenverständnis.

+0

Danke für die Antwort und Erklärung warum! Es gibt ziemlich viele Informationen, die ich aufnehmen muss. Es ist definitiv ein Wechsel von R, wo du einfach "which (x)" machen kannst und fertig damit bist! – J4y

+1

@ J4y: Ich denke 'numpy.where' ist irgendwie/sorta Pythons Antwort auf' was'. Wenn du von R kommst, möchtest du Python + NumPy lieber als reines Python betrachten. –

2

Ein einfacher Einzeiler wäre:

[i+1 for i in range(len(x)) if x[i]] 
7

Verwenden enumerate innerhalb einer Liste Verständnis:

>>> [i for i, j in enumerate(x, 1) if j] 
[1, 4]