2013-07-05 1 views
2

Si j'ai la liste:Comment renvoyer l'index d'un groupe de valeurs d'une liste pour une valeur spécifique dans le groupe?

list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")]

Je veux obtenir l'indice du groupe qui a la valeur 13 en elle:

if 13 in list1[0]: 
     idx = list1.index(13) 
     item = list1[idx] 
     print str(item) 

     [13, EF, GH] 

Lorsque je tente, je continue à recevoir " Index pas dans la liste ", même si elle passe l'instruction if parce qu'elle trouve la valeur 13 dans la liste.

+0

Vous pourriez envisager de coller l'exception soulevée exact de le décrire. C'est le moyen le plus clair et le plus propre. Cela étant dit, votre problème n'est pas à l'instruction if, mais dans le bloc if. – woozyking

+1

Vous obtenez l'erreur car 13 n'est pas dans 'list1'. C'est dans 'list1 [1]'. – bogatron

+0

@bogatron 13 n'est pas dans 'list1 [0]', il est dans 'list1 [1]'. –

Répondre

3

Vous pouvez utiliser next et enumerate:

>>> list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")] 
>>> next(i for i,x in enumerate(list1) if 13 in x) 
1 

Avec une simple boucle:

for i, item in enumerate(list1): 
    if 13 in item: 
     print i 
     break 
...   
1 

Mise à jour:

Si le premier élément de chaque tuple est unique et vous faites ceci plusieurs fois puis créez un dict en premier. Dicts fournissent O(1) recherche tandis que les listes O(N)

>>> list1 = [(12, "AB", "CD"), (13, "EF", "GH"), (14, "IJ", "KL")] 
>>> dic = {x[0]:x[1:] for x in list1} 

articles: Accès

>>> dic[12] 
('AB', 'CD') 
>>> dic[14] 
('IJ', 'KL') 
#checking key existence 
>>> if 17 in dic:   #if a key exists in dic then do something 
     #then do something 
+0

Merci. Lequel de ceux-ci donnerait une meilleure performance? La liste peut potentiellement contenir des dizaines de milliers d'enregistrements. – user2259908

+0

@ user2259908 Les deux sont des approches 'O (N)', la différence va être très inférieure. Le second est un peu plus lisible. –

+0

@ user2259908 Si le premier élément est unique dans chaque tuple et que vous le faites plusieurs fois, je vous suggère de créer un dictionnaire pour améliorer les performances. –

0

Compte tenu du critère ajouté du commentaire « Je ne me soucie pas où ils se trouvent dans la liste » la tâche devient beaucoup plus facile et beaucoup plus évident

def get_ids(id, tuple_list): 
    """returns members from tuple_list whose first element is id""" 
    return [x for x in tuple_list if x[0] == id] 

Ce n'est pas aussi cher qu'on pourrait s'y attendre si vous vous souvenez que les tuples sont des objets immuables. Lorsque l'interpréteur construit la nouvelle liste, il ne contient que l'identifiant interne (référence) des tuples d'intérêt. Ceci est conforme à la question initiale demandant une liste d'indices. La compréhension des listes telle qu'elle est utilisée ici est un moyen efficace de construire de nouvelles listes, car le travail est effectué en interne par l'interprète. En résumé, de nombreuses intuitions de langages en C sur les performances ne s'appliquent pas bien à Python. En tant que Ashwini noted, si les numéros d'identification dans les tuples sont uniques et que vous effectuez plusieurs requêtes, un dictionnaire peut être une structure plus appropriée. Même si les numéros d'identification ne sont pas uniques, vous pouvez utiliser un dictionnaire de listes de tuples, mais il est préférable de faire d'abord la chose la plus claire et de ne pas deviner la performance à l'avance.

Comme l'exemple le dictionnaire, car une liste vide est « Falsey » en Python, vous pouvez utiliser le même type de condition:

hits = get_ids(13, list1) 
if hits: 
    # we got at least one tuple back 
else: 
    # no 13s to be had 
Questions connexes