2010-04-27 44 views
1

Je peux filtrer le dictionnaire suivant comme:Quelle est la manière non brute de filtrer un dictionnaire Python?

data = { 
    1: {'name': 'stackoverflow', 'traffic': 'high'}, 
    2: {'name': 'serverfault', 'traffic': 'low'}, 
    3: {'name': 'superuser', 'traffic': 'low'}, 
    4: {'name': 'mathoverflow', 'traffic': 'low'}, 
} 

traffic = 'low' 

for k, v in data.items(): 
    if v['traffic'] == traffic: 
     print k, v 

Y at-il une autre façon de faire le filtrage ci-dessus?

+0

Sauf si vous gardez les choses triées d'une certaine manière, le meilleur algorithme que vous aurez est O (n) dans le temps, ce qui est plutôt mcuh ce que vous faites. –

+0

Si cela vous coûte trop cher, vous devez inverser la structure des données, c'est-à-dire accélérer la création des listes de sites avec le trafic foo en même temps que le dictionnaire. – hop

+0

Pour suivre @hop, si vous avez besoin de faire ce type de recherche "beaucoup" sur un jeu de données "immuable", saisissez les éléments de la valeur que vous recherchez. –

Répondre

2

À un certain niveau, le filtre devra faire exactement ce que vous décrivez. Si vous voulez filtrer les valeurs, vous devrez traiter chacune d'elles, une par une.

1

En principe - non. Vous pourriez réécrire le code légèrement, mais il ferait toujours la même chose - en parcourant toutes les valeurs.

2

Bien sûr, mais ils sont tous force brute.

dict((k, v) for (k, v) in data.iteritems() if v['traffic'] == traffic) 
2

Si vous faites cela souvent, vous pouvez avoir deux dictionnaires, un pour chaque direction. Le nouveau dictionnaire mappera les valeurs aux listes de valeurs. C'est une bonne idée si vous allez faire cette recherche inversée plus d'une fois.