/ / Ermitteln des Maximums der Summe der Werte im inneren verschachtelten defaultdict - Python, Summe, Maximum, Zähler, Defaultdict

Das Maximum der Summe der Werte im inneren verschachtelten Standarddict finden - python, sum, max, counter, defaultdict

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 № 1

Sie 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] )