Ich möchte die Nummer von tags
in einem mehrdimensionalen Array. So mach ich es:
l["users"]
sind meine Daten (Array)
tags = {}
for u in l["users"]:
for p in u["photos"]:
for t in p["tags"]:
if tags.get(t):
tags[t] +=1
else:
tags[t] = 1
Gibt es einen saubereren oder schnelleren Weg, diesen Code zu schreiben?
Antworten:
3 für die Antwort № 1Wie wäre es mit dieser schnellen und pythonischen Ein-Liner-Lösung? Sammlungen.Zähler ():
Ein Counter ist eine Dict-Unterklasse zum Zählen von Hash-Objekten. Es ist ein ungeordnete Sammlung, in der Elemente als Wörterbuchschlüssel und gespeichert werden Ihre Zählungen werden als Wörterbuchwerte gespeichert.
Counter(t for u in l["users"] for p in u["photos"] for t in p["tags"])
DEMO:
from collections import Counter
l = {"users": [{"photos": [{"tags": [1,2,3,4,5]}, {"tags": [3,4,5]}]},
{"photos": [{"tags": [1]}, {"tags": [2,3,4,5]}]}]}
tags = Counter(t for u in l["users"] for p in u["photos"] for t in p["tags"])
print tags # prints Counter({3: 3, 4: 3, 5: 3, 1: 2, 2: 2})
1 für die Antwort № 2
Benutze einen collections.defaultdict(int)
, die verwenden werden 0
als Standardwert für einen Schlüssel, der noch keinen Schlüssel hat:
import collections
tags = collections.defaultdict(int)
for u in l["users"]:
for p in u["photos"]:
for t in p["tags"]:
tags[t] +=1
Ebenfalls, if tags.get(t)
ist ein schlechter Weg, um zu überprüfen, ob t
ist ein Schlüssel in tags
Dies gilt insbesondere, da es in einem Kontext fehlschlägt, in dem ein Wert in einem booleschen Kontext als falsch angesehen werden kann.
if t in tags:
0 für die Antwort № 3
Sammlungen. Zähler ist gut um Dinge zu zählen.