2010-11-05 10 views
12

C'è qualche modo semplice in Python per realizzare ciò che la funzione di match fa in R? ciò che corrisponde a R fa è che restituisce un vettore delle posizioni delle (prime) corrispondenze del suo primo argomento nel suo secondo.python (o numpy) equivalente di match in R

Ad esempio, il seguente snippet R.

> a <- c(5,4,3,2,1) 
> b <- c(2,3) 
> match(a,b) 
[1] NA NA 2 1 NA 

Tradurre che in python, quello che sto cercando è una funzione che fa la seguente

>>> a = [5,4,3,2,1] 
>>> b = [2,3] 
>>> match(a,b) 
[None, None, 2, 1, None] 

Grazie!

risposta

22
>>> a = [5,4,3,2,1] 
>>> b = [2,3] 
>>> [ b.index(x) if x in b else None for x in a ] 
[None, None, 1, 0, None] 

Somma 1 se è davvero necessario posizionare "uno basato" anziché "zero basato".

>>> [ b.index(x)+1 if x in b else None for x in a ] 
[None, None, 2, 1, None] 

È possibile effettuare questa riutilizzabile one-liner, se avete intenzione di ripetere un sacco:

>>> match = lambda a, b: [ b.index(x)+1 if x in b else None for x in a ] 
>>> match 
<function <lambda> at 0x04E77B70> 
>>> match(a, b) 
[None, None, 2, 1, None] 
+0

Grande! Grazie! – djiao

+0

Bello. È un ottimo modo per aggirare l'errore list.index() quando l'elemento non esiste. – hatmatrix