Angenommen defaultdict(Counter)
so wie:
from collections import defaultdict, Counter
from collections import defaultdict, Counter
x = {("a", "z"): Counter({"crazy": 1, "lazy": 1}),
("b", "r"): Counter({"brown": 1}),
("d", "o"): Counter({"dog": 1}),
("e", "r"): Counter({"over": 1}),
("f", "o"): Counter({"fox": 1}),
("h", "e"): Counter({"the": 2}),
("j", "u"): Counter({"jumps": 1}),
("l", "a"): Counter({"lazy": 1}),
("m", "p"): Counter({"jumps": 1}),
("o", "g"): Counter({"dog": 1}),
("o", "v"): Counter({"over": 1}),
("o", "w"): Counter({"brown": 1}),
("o", "x"): Counter({"fox": 1}),
("p", "s"): Counter({"jumps": 1}),
("r", "o"): Counter({"brown": 1}),
("t", "h"): Counter({"the": 2}),
("u", "m"): Counter({"jumps": 1}),
("v", "e"): Counter({"over": 1}),
("w", "n"): Counter({"brown": 1}),
("z", "y"): Counter({"crazy": 1, "lazy": 1})}
Ich kann auf die Werte in der Tupel-Taste als solche zugreifen:
>>> x[("a", "z")]
Counter({"crazy": 1, "lazy": 1})
Wenn ich die Tupel-Taste mit der höchsten Summe der Werte im inneren Wörterbuch, d.
>>> max([(sum(x[ng].values()), ng) for ng in x])
(2, ("z", "y"))
>>> max([(sum(x[ng].values()), ng) for ng in x])[1]
("z", "y")
Ich denke, die Schritte sind etwas kompliziert, um die maximalen Werte zu erhalten. Gibt es einen einfacheren Weg, um die maximale Summe der Werte im inneren verschachtelten Standarddict zu erhalten?
Beachten Sie so viel wie möglich, erstellen Sie kein anderes Objekt aus x
. Dieses Beispiel ist klein, aber die tatsächliche Größe der x
Das Objekt kann 1.000.000 Schlüssel enthalten, und die inneren Zähler können eine Größe von 10.000.000 haben.
Antworten:
2 für die Antwort № 1Sie können den Wert in der Iteration abrufen, um zu vermeiden, dass der Wert mit nachgeschlagen wird []
, aber es ist nicht so viel sauberer:
max((sum(c.values()), key) for key, c in x.items())
Sie können max mit einer Funktion versehen, die schön aussieht, wenn Sie nur den Schlüssel des max-Eintrags zurückgeben möchten:
max(x, key=lambda k: sum(x[k].values()))
2 für die Antwort № 2
[]
sind nicht erforderlich
print ( max((sum(x[ng].values()), ng) for ng in x)[1] )
Aufräumen mit .items ()
print ( max((sum(v.values()), k) for k,v in x.items())[1] )
Max w / Lambda-Version
print ( max(x, key=lambda y: sum(x[y].values())) )
Das map
Methode
print ( max(map(lambda ng: (sum(x[ng].values()), ng), x))[1] )