2012-11-23 6 views
1

J'ai ceci:entrée de liste Python recherche

[[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]] 

Je veux faire une entrée pour rechercher a/b/c/d/e et la sortie de l'indice de cette lettre.

Par exemple, lors de la recherche a -> index=0, b and c -> index=1, d and e -> index=2

Comment est-ce possible sur Python 3.x

Répondre

2

Vous devrez d'abord parcourir la liste, puis parcourir pour chaque liste obtenue pour obtenir des tuples.

>>> my_list = [[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]] 
>>> 
>>> def search(val): 
     for index, inner_list in enumerate(my_list): 
      for nested_tuple in inner_list: 
       if val in nested_tuple: 
        return index 


>>> search('a') 
0 
>>> search('c') 
1 
>>> search('e') 
2 
+0

Vous n'êtes pas toujours à la recherche de «a», alors faisons-en une fonction appropriée. –

+0

@tvdien .. A fait. merci :) –

+0

Sauf pour cela, il y a une erreur maintenant. ;) –

2

Vous aurez besoin d'une boucle imbriquée:

def find_index (data, key): 
    for i, d in enumerate (data): 
     for t in d: 
      if t[1] == key: 
       return i 

Ce sera de retour (par défaut) Aucun lorsque la clé n'est pas trouvée.

+2

Pas très pythonique faire un 'pour i dans la gamme (len (données)). Utilisez plutôt 'enumerate()'. –

+0

Je ne savais pas à ce sujet, merci. Je l'ai changé maintenant. C'est beaucoup plus agréable en effet. –

3

Vous pouvez utiliser un dict comprehension pour faire une cartographie des lettres à l'index:

data = [[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]]  
mapping = {key:index for index, items in enumerate(data) for num, key in items} 
print(mapping) 

rendements

{'a': 0, 'c': 1, 'b': 1, 'e': 2, 'd': 2} 
0
 python 3.2 
    lis= [[(1, 'a')], [(2, 'b'), (2, 'c')], [(3, 'd'), (3, 'e')]] 


    # method 1. list comprehension 
    >>> [i for i,v in enumerate(lis)for g in v if "a" in g] 

    # method 2. loop 

     def search(x): 
      for i,v in enumerate(lis): 
       for k in v: 
         if x in k: return i