2010-08-24 5 views
0

J'utilise Python 2.6 et j'ai deux magasins de données. L'interrogation du premier renvoie une liste d'ID de document dans un ordre spécifique. Je consulte tous les documents à la fois dans le deuxième magasin de données en utilisant ces identifiants, ce qui renvoie une liste de dictionnaires (un pour chaque document), mais pas dans le même ordre que la liste originale. J'ai maintenant besoin de re-trier cette liste de dictionnaires de sorte que les documents sont dans l'ordre que leurs identifiants étaient dans la première liste. Quelle est la meilleure façon de faire cela?Liste de tri des dictionnaires selon l'ordre spécifique

+0

I Je me prépare pour une solution époustouflante ... –

+0

Sooo .. Est-ce que votre magasin de données ne supporte pas les jointures, ou ne connaissez-vous pas les jointures? –

+0

Avez-vous vérifié cela? http://stackoverflow.com/questions/3301406/reordering-list-of-dicts-arbitrarily-in-python – tokland

Répondre

4

Ne le faites pas. Déplacez votre "liste de dictionnaires (un pour chaque document), mais pas dans le même ordre que la liste originale" dans un dictionnaire.

Ce nouveau dictionnaire de dictionnaires possède la clé correspondante.

Ensuite parcourez votre première liste dans l'ordre et trouvez les éléments du dictionnaire de dictionnaires qui correspondent.

some_list= query_data_store_1() 
some_other_list= query_data_store_2(some_list) 

dict_of_dict = dict((d['key'], d) for d in some_other_list) 

for item in some_list: 
    other_item = dict_of_dict[ item['key'] ] 

    # Now you have item from the first list matching item from the second list. 
    # And it's in order by the first list. 
+0

dict_of_dict = dict (d ['id'], d pour d dans some_other_list) – kurosch

1

Vous pouvez construire un ids de cartographie dictionnaire séparés à des positions et l'utiliser pour commander les documents:

ids = ... 
positions = {} 
for pos, id in enumerate(ids): 
    positions[id] = pos 

docs = ... 
docs.sort(key=lambda doc: positions[doc['id']]) 
Questions connexes