2017-10-26 2 views
1

Ich habe eine Liste von etwa 58.000 Zeilen, und jede Zeile ist ein Wörterbuch.Ermitteln Sie die Position der fehlenden Schlüssel, die KeyError

Beispiel:

my_list_of_dicts = 
[{'id': '555', 'lang': 'en'}, 
{'id': '444', 'lang': 'en'}, 
{'id': '333', 'lang': 'fr'}, 
{'id': '222', 'lang': 'es'}, 
{'id': '111', 'lang': 'ge'}, 
{'id': '666', 'lang': 'fr'}, 
{'id': '777', : 'du'}] 

In jedem Wörterbuch, werden Sie sehen, dass ich einen Schlüssel „lang hat‘ mit einem entsprechenden Wert, der eine Abkürzung für mehrere Sprachen ist (‚en‘, ‚es‘, ‚fr‘, ‚du‘, ‚ge‘, etc ...)

ich habe den Code erfolgreich geschrieben ich brauche eine Serie zu produzieren, die eine value_count von alle eindeutigen Werte in diesem Schlüssel enthält.

Wenn ich das mache, bekomme ich einen KeyError, weil es anscheinend ein paar Wörterbücher gibt, die das tun nicht den 'lang'-Wert enthalten

Ich habe einen Befehl try/except erstellt, mit dem ich diese fehlenden Werte überspringen kann. Es sieht so aus, als gäbe es 5 Reihen von 58.000 mit einer fehlenden 'lang'-Taste.

Ich möchte die Position dieser fehlenden Werte für 'lang' finden. Mit anderen Worten, wie kann ich aus etwa 58.000 Zeilen herausfinden, welche 5 Zeilen einen fehlenden 'lang'-Schlüssel haben?

+2

'[Artikel für Artikel in my_list_of_dicts wenn" lang "nicht im Artikel]' – Sraw

+0

Danke. Dies erzeugt eine Liste der Zeilen mit dem fehlenden 'lang'-Wert. Dies zeigt jedoch nicht die Position dieser Zeilen in der Liste von 58.000. Ich hoffe zum Beispiel zu erkennen, dass die Zeilen mit den fehlenden "lang" -Tasten die Zeilen 10.453 und 20.432 und 22.304 und 52.302 und 55.211 sind. Gibt es eine Möglichkeit, das zu tun? – TJE

+1

'[Index für Index im Bereich (len (my_list_of_dicts)) wenn" lang "nicht in my_list_of_dicts [index]]' – Sraw

Antwort

1

Sie get verwenden können und enumerate:

my_list_of_dicts = 
[{'id': '555', 'lang': 'en'}, 
{'id': '444', 'lang': 'en'}, 
{'id': '333', 'lang': 'fr'}, 
{'id': '222', 'lang': 'es'}, 
{'id': '111', 'lang': 'ge'}, 
{'id': '666', 'lang': 'fr'}, 
{'id': '777', "missing_lang": 'du'}] 
missing_vals = [i for i, a in enumerate(my_list_of_dicts) if not a.get("lang", False)] 

Bär in Beachten Sie, dass das ursprüngliche Wörterbuch, das Sie hatten,enthieltist ein ungültiges Schlüssel/Wert-Paar, das beim Ausführen der Datei einen Fehler verursachen würde. Daher habe ich einen Platzhalterwert zu Demonstrationszwecken hinzugefügt.

+0

Ja, das funktioniert perfekt. Ich fand die Reihe #s, die ich suchte. Vielen Dank! – TJE

0

aus der Antwort geht oben in den Kommentaren,

counter = 0: 
for item in my_list_of dicts: 
     if "lang" not in item: 
      print(counter) 
     counter += 1 

den ID-Schlüssel zu erhalten,

for item in my_list_of_dicts: 
     if "lang" not in item: 
      print(item['id']) 
0

Ihre Liste ist kein echtes Beispiel, da im Dict kein Schlüssel vorhanden ist. Nehmen wir an, es sieht so aus: my_list_of_dicts = [ {'id': '555', 'lang': 'en'}, {'id': '444', 'lang': 'en'}, {'id': '777', 'x': 'du'}]

Sie können die Liste von Tupeln mit dem Index und Einzelteil erhalten mit:

[(index, item) for index, item in enumerate(my_list_of_dicts) if 'lang' not in item]

0

Da diese Frage markierte Pandas ist, könnten Sie Dataframe Konstruktor versuchen:

In [11]: my_list_of_dicts = \ 
    ...: [{'id': '555', 'lang': 'en'}, 
    ...: {'id': '444', 'lang': 'en'}, 
    ...: {'id': '333', 'lang': 'fr'}, 
    ...: {'id': '222', 'lang': 'es'}, 
    ...: {'id': '111', 'lang': 'ge'}, 
    ...: {'id': '666', 'lang': 'fr'}, 
    ...: {'id': '777', }] # example one with no lang 

In [12]: df1 = pd.DataFrame(my_list_of_dicts) 

In [13]: df1 
Out[13]: 
    id lang 
0 555 en 
1 444 en 
2 333 fr 
3 222 es 
4 111 ge 
5 666 fr 
6 777 NaN 

In [14]: df1[df1.lang.isnull()] # rows with a NaN (missing) lang 
Out[14]: 
    id lang 
6 777 NaN 
Verwandte Themen