Holen Sie sich eine Liste aller Schlüssel in verschachtelten Wörterbuch

Ich möchte eine Liste aller Schlüssel in einem verschachtelten Wörterbuch erhalten, das Listen und Wörterbücher enthält.

Ich habe derzeit diesen Code, aber es scheint zu fehlen Hinzufügen einige Schlüssel zur Liste und auch Duplikat fügt einige Tasten.

keys_list = [] def get_keys(d_or_l, keys_list): if isinstance(d_or_l, dict): for k, v in iter(sorted(d_or_l.iteritems())): if isinstance(v, list): get_keys(v, keys_list) elif isinstance(v, dict): get_keys(v, keys_list) else: keys_list.append(k) elif isinstance(d_or_l, list): for i in d_or_l: if isinstance(i, list): get_keys(i, keys_list) elif isinstance(i, dict): get_keys(i, keys_list) else: print "** Skipping item of type: {}".format(type(d_or_l)) return keys_list 

Das macht einfach eine leere Liste und füllt sie mit den Schlüsseln. D_or_l ist eine Variable und nimmt das Original dict, um es zu vergleichen.

  • Python: Überprüfen, ob ein 'Wörterbuch' leer ist, scheint nicht zu funktionieren
  • Heapq mit benutzerdefinierten vergleichen prädikat
  • Python: Teilen von riesigen Wörterbüchern mit Multiprocessing
  • Python-Wörterbücher - finden Sie das zweite Zeichen in einer 2-Zeichen-Zeichenfolge, die einen minimalen Wert ergibt
  • Drehen einer Liste von Listen in ein Wörterbuch von Listen
  • Dynamisch dict Elemente über getattr?
  • Wie bekomme ich einen zufälligen Wert im Python-Wörterbuch
  • Zip zwei Werte aus dem Wörterbuch in Python
  • 2 Solutions collect form web for “Holen Sie sich eine Liste aller Schlüssel in verschachtelten Wörterbuch”

    Das sollte der Job machen:

     def get_keys(dl, keys_list): if isinstance(dl, dict): keys_list += dl.keys() map(lambda x: get_keys(x, keys_list), dl.values()) elif isinstance(dl, list): map(lambda x: get_keys(x, keys_list), dl) 

    Um Duplikate zu vermeiden, kannst du Set verwenden, zB:

     keys_list = list( set( keys_list ) ) 

    Beispiel Testfall:

     keys_list = [] d = {1: 2, 3: 4, 5: [{7: {9: 1}}]} get_keys(d, keys_list) print keys_list >>>> [1, 3, 5, 7, 9] 

    Wie es steht, ignoriert dein Code Schlüssel, die zur list oder Werte dict . Entfernen Sie den else Block in Ihrem ersten for Schleife, möchten Sie den Schlüssel hinzufügen, egal was der Wert ist.

     keys_list = [] def get_keys(d_or_l, keys_list): if isinstance(d_or_l, dict): for k, v in iter(sorted(d_or_l.iteritems())): if isinstance(v, list): get_keys(v, keys_list) elif isinstance(v, dict): get_keys(v, keys_list) keys_list.append(k) # Altered line elif isinstance(d_or_l, list): for i in d_or_l: if isinstance(i, list): get_keys(i, keys_list) elif isinstance(i, dict): get_keys(i, keys_list) else: print "** Skipping item of type: {}".format(type(d_or_l)) return keys_list 

    get_keys({1: 2, 3: 4, 5: [{7: {9: 1}}]}, keys_list) gibt [1, 3, 9, 7, 5]

    Um eine Vervielfältigung zu vermeiden, können Sie statt einer list einen set Datentyp verwenden.

    Python ist die beste Programmiersprache der Welt.