2015-04-07 1 views
2

Si je devais le code suivantRetour un dict spécifique à partir d'une liste des dicts

attributes = [] 

attributes.append({'attribute': 'noir', 'group': 'coloris', 'id': '8'}) 
attributes.append({'attribute': 's', 'group': 'taille_textile', 'id': '29'}) 
attributes.append({'attribute': 'm', 'group': 'taille_textile', 'id': '24'}) 
attributes.append({'attribute': 'l', 'group': 'taille_textile', 'id': '25'}) 
attributes.append({'attribute': 'xl', 'group': 'taille_textile', 'id': '26'}) 

et je voulais retourner un objet de la liste qui contenait un certain id, quelle serait la meilleure façon de le faire ?

Je sais qu'une solution serait d'utiliser la boucle for comme celui-ci

def getItemById(id): 
    for i in attributes: 
     for k,v in i.items(): 
      if (k == 'id' and v == id): 
       return i 

Je suis sûr qu'il doit y avoir un moyen beaucoup plus élégant ou efficace de le faire autre que cela?

Y at-il une possibilité d'utiliser lambdas ici? cela donnerait-il un avantage de performance?

+1

Si vous voulez accéder par 'id', pourquoi les mettre dans une liste, plutôt que dans un dictionnaire ** keyed ** par' id'? – jonrsharpe

+0

http://stackoverflow.com/q/8653516/403554 –

Répondre

2

Par exemple, vous voulez retourner l'objet avec 'id'='29'

Cela fonctionne

[x for x in attributes if x['id']=='29'][0] 

{'attribute': 's', 'group': 'taille_textile', 'id': '29'} 
+0

Les deux soloutions sont très bonnes et bien meilleures que les miennes, mais John tu as plus besoin de réputation que Daniel, alors j'ai choisi ta réponse, elle aussi est très soignée , bien rangé et simple –

5

Vous pouvez utiliser un générateur:

next(attr for attr in attributes if attr['id'] == id_to_find) 
+0

Je pense que c'est la façon la plus élégante et pythonique. :) +1 – Shashank

1

Une autre approche consiste à convertir Liste à une trame de données de pandas géants .

import pandas as pd 
    df = pd.DataFrame(attributes) 

    #get all columns where id=8 
    print df[df['id']=='8'] 

    #get specific column where id=29 
    print df['attribute'][df['id']=='29']