2016-07-28 15 views
1

Ich möchte eine Liste von Wörterbüchern basierend auf dem Vorhandensein von Schlüsseln sortieren. Nehmen wir an, ich habe eine Liste von Schlüsseln [key2, key3, key1], ich muss die Liste so ordnen, dass das Wörterbuch mit key2 zuerst kommt, key3 mit second und key1 zuletzt.Liste der Wörterbücher basierend auf Schlüsseln sortieren

sah ich diese Antwort (Sort python list of dictionaries by key if key exists), aber es bezieht sich auf nur einen Schlüssel

Die Sortierung nicht auf Wert der ‚Schlüssel‘ basiert. Es hängt vom Vorhandensein des Schlüssels und auch von einer vordefinierten Liste von Schlüsseln ab.

+3

Bitte teilen Sie Ihren Code, was Sie ausprobiert haben? – bhansa

+0

@ Aurora0001 - Definitiv kein Betrüger dieser Frage. Diese Frage fragt nach dem Sortieren eines Diktats - diese Frage bezieht sich auf das Sortieren einer Liste von Diktaten ... – mgilson

+0

Entschuldigung, habe die Frage völlig falsch gelesen. – Aurora0001

Antwort

1

Verwenden Sie einfach sorted mit einer Liste wie [key1 in dict, key2 in dict, ...] als der Schlüssel nach sortieren. Denken Sie daran, das Ergebnis umzukehren, da True (d. H. Der Schlüssel ist in dict) nach sortiert ist.

>>> dicts = [{1:2, 3:4}, {3:4}, {5:6, 7:8}] 
>>> keys = [5, 3, 1] 
>>> sorted(dicts, key=lambda d: [k in d for k in keys], reverse=True) 
[{5: 6, 7: 8}, {1: 2, 3: 4}, {3: 4}] 

Dies wird alle die Tasten Bindungen zu brechen, das heißt im obigen Beispiel gibt es zwei, die den Schlüssel dicts 3 haben, aber man hat auch den Schlüssel 1, so ist dies ein zweites sortiert.

+0

Wenn dieses Sortierverhalten (Bindeschlüssel basierend auf der Anzahl der vorhandenen Schlüssel, anstatt die ursprüngliche Reihenfolge bei Bindungen beizubehalten) gewünscht ist, ist dies der beste Weg, dies zu tun - nun, die Version, die ich geschrieben und dann aufgegeben habe 'tuple (k in d für k in Schlüsseln) 'anstatt ein Listenverstehen, aber das sollte keinen Unterschied machen. Ich vermutete, dass Stabilität bei Bindungen das bevorzugte Verhalten des OP sein würde, aber es ist nicht so, wie die Frage es so oder so aussagt. –

0

Wie sei es so etwas wie dies

def sort_key(dict_item, sort_list): 
    key_idx = [sort_list.index(key) for key in dict_item.iterkeys() if key in sort_list] 
    if not key_idx: 
     return len(sort_list) 
    return min(key_idx) 

dict_list.sort(key=lambda x: sort_key(x, sort_list)) 

Wenn das ein bestimmtes Wörterbuch in der Liste mehr als einen der Schlüssel in der Sortierliste enthält, wird das mit dem niedrigsten Index verwenden. Wenn keiner der Schlüssel in der Sortierliste vorhanden ist, wird das Wörterbuch an das Ende der Liste gesendet.

Wörterbücher, die den gleichen "besten" Schlüssel (d. H. Den niedrigsten Index) enthalten, werden hinsichtlich der Reihenfolge als gleich angesehen. Wenn das ein Problem ist, wäre es nicht zu schwer, die sort_key Funktion alle Schlüssel statt nur die besten zu berücksichtigen. , das zu tun, geben Sie einfach die ganze key_idx statt min(key_idx) und statt len(sort_list) Rückkehr [len(sort_list)]

0

Ich würde tun dies mit:

sorted_list = sorted(dict_list, key = lambda d: next((i for (i, k) in enumerate(key_list) if k in d), len(key_list) + 1)) 

, die einen Generator Ausdruck verwendet den Index in der Schlüsselliste zu finden des ersten Schlüssels, der in jedem Wörterbuch enthalten ist, verwenden Sie diesen Wert dann als Sortierschlüssel, wobei dicts, die keinen Schlüssel enthalten, len(key_list) + 1 als Sortierschlüssel erhalten, damit sie bis zum Ende sortiert werden.

Verwandte Themen