2010-11-05 12 views
12

Existe-t-il un moyen simple en python d'accomplir ce que fait la fonction de correspondance dans R? ce qui correspond dans R est qu'il renvoie un vecteur des positions des (premières) correspondances de son premier argument dans sa seconde.Python (ou numpy) équivalent de correspondance dans R

Par exemple, l'extrait R suivant.

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

Traduire en python que, ce que je cherche est une fonction qui effectue les opérations suivantes

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

Merci!

Répondre

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] 

Somme 1 si vous avez vraiment besoin d'une position "one based" au lieu de "zero based".

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

Vous pouvez faire ce réutilisable en une ligne si vous allez le répéter beaucoup:

>>> 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

Great! Je vous remercie! – djiao

+0

Nice. C'est un excellent moyen de contourner l'erreur list.index() lorsque l'élément n'existe pas. – hatmatrix