2012-06-04 5 views
1

Dans le tableau suivant, je veux sélectionner un sous-réseau de tableau a lorsqu'un id est connuSélectionnez un tableau à partir d'un tableau multidimensionnel

a=[['id123','ddf',1],['id456','ddf',1],['id789','ddf',1]] 

Je sais que l'id-à-dire, id456, sur cette base comment peut Je sélectionne les valeurs ['id456','ddf',1] de a sans utiliser de boucle.

+0

'sans utiliser de boucle '. Est-ce que ce sont les devoirs? –

+0

définitivement pas un devoir .. – Rajeev

+0

Que voulez-vous dire par aucune boucle? Comme dans aucun normal pour la boucle? Les expressions génératrices comme la mienne sont-elles autorisées? – jamylak

Répondre

2
>>> a = [['id123','ddf',1],['id456','ddf',1],['id789','ddf',1]] 
>>> next(x for x in a if x[0] == 'id456') 
['id456', 'ddf', 1] 

Je recommanderais plutôt l'utilisation d'un dictionnaire à la place.

1

Je pense que cela devrait fonctionner ...

filter(lambda x:x[0]=='id456',a)[0] 

Mais dans ce cas, ne serait pas un dictionnaire une meilleure structure de données?

+1

Cela passerait toujours par toute la liste avant qu'elle ne soit terminée. Et imo, un dictionnaire comme vous l'avez dit serait une meilleure structure de données à utiliser. –

+0

@ChristianWitts Cela pourrait fonctionner efficacement dans Python 3 en utilisant 'next' au lieu de' [0] 'mais comme je suis d'accord c'est inefficace et l'utilisation de lambda le rend laid par rapport à une expression de générateur. – jamylak

0

Une structure de dictionnaire fonctionnerait beaucoup mieux.

b = {'id123': ['ddf', 1], 'id456': ['dff', 1], 'id789': ['ddf', 1]} 
print b['id123'] 
0

Si la liste est triée, vous pouvez utiliser le module bisect:

>>> i = bisect.bisect_left(a, ['id456']) 
>>> if i < len(a) and a[i][0]=='id456': 
...  print a[i] 
... 
['id456', 'ddf', 1] 
0

Vous pouvez utiliser numpy.where() pour le faire:

a = numpy.array(a) 

row = numpy.where(a == 'id456')[0] 

sub_array = a[row,:] 

Cela va vérifier les éléments avec le choix id et redonner leurs index. Vous pouvez utiliser ces index pour prendre des tranches du tableau d'origine, comme le montre l'exemple.

Ce code ne fonctionnera que s'il y a une seule ligne pour l'ID donné, mais il peut être adapté.

Espérons que cela aide.

Questions connexes