2012-06-29 4 views
1

Je suis un débutant à Python et j'ai besoin de conseils. Quelle est la meilleure façon de parcourir la liste ci-dessous?Comment faire pour rechercher des données dans la liste python

[('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 

Je veux d'abord obtenir toutes les admincases valeur unique comme:

['admincases', 'admincases1'] 

ensuite itérer les cas ci-dessus, je devrais obtenir la liste des tests pour le cas spécifié:

'admincase' 
    ['test_case_6', 'test_case_8'] 
'admincase1' 
    ['test_case_8', 'test_case_9', 'test_case_10'] 

Répondre

3

Utilisez un defaultdict

>>> from collections import defaultdict 
>>> d = defaultdict(list) 
>>> l = [('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 
>>> for k,v in l: 
... d[k].append(v) 
... 
>>> d['admincases'] 
['test_case_6', 'test_case_8'] 
1
>>> lis= [('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 

>>> lis1=list({x[0] for x in lis}) #returns ['admincases', 'admincases1'] 

>>> dic={y:[x[1] for x in lis if x[0]==y]for y in lis1} 
>>> dic 
{'admincases': ['test_case_6', 'test_case_8'], 'admincases1': ['test_case_8', 'test_case_9', 'test_case_10']} 
2
>>> itertools.groupby(L, key=operator.itemgetter(0)) 
<itertools.groupby object at 0x7fb79740aa48> 
>>> list(itertools.groupby(L, key=operator.itemgetter(0))) 
[('admincases', <itertools._grouper object at 0x7fb797405a10>), ('admincases1', <itertools._grouper object at 0x7fb797405a50>)] 
>>> [(x[0], list(x[1])) for x in itertools.groupby(L, key=operator.itemgetter(0))] 
[('admincases', [('admincases', 'test_case_6'), ('admincases', 'test_case_8')]), ('admincases1', [('admincases1', 'test_case_8'), ('admincases1', 'test_case_9'), ('admincases1', 'test_case_10')])] 

Assurez-vous que votre entrée est sorte d par la clé d'abord cependant.

0

Voici une autre approche à la solution de @ BurhanKhalid à l'aide dict.setdefault au lieu de defaultdict. Je préfère defaultdict mais apparemment c'est plus rapide si la valeur par défaut ne prend pas beaucoup de temps à construire.

>>> L = [('admincases', 'test_case_6'), ('admincases', 'test_case_8'),('admincases1', 'test_case_8'),('admincases1', 'test_case_9'),('admincases1', 'test_case_10')] 
>>> D = {} 
>>> for k,v in L: 
     D.setdefault(k,[]).append(v) 


>>> D['admincases'] 
['test_case_6', 'test_case_8'] 
Questions connexes