/ / Encontrando o máximo da soma dos valores no padrão interno aninhado default - python, sum, max, counter, defaultdict

Encontrar o máximo da soma dos valores no padrão interno aninhado default - python, sum, max, counter, defaultdict

Dado um defaultdict(Counter) assim sendo:

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})}

Eu posso acessar os valores na chave da tupla como tal:

>>> x[("a", "z")]
Counter({"crazy": 1, "lazy": 1})

Se eu quiser encontrar a chave da tupla com a maior soma dos valores no dicionário interno, ou seja, o contador, eu posso fazer isso:

>>> 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")

Eu acho que os passos são um pouco complicados para obter os valores máximos. Existe uma maneira mais simples de obter o máximo da soma dos valores no padrão interno aninhado?

Note o máximo possível que não recriar outro objeto de x. Esta amostra é pequena, mas o tamanho real do x objeto pode conter 1.000.000 chaves e os contadores internos podem ter 10.000.000 de tamanho.

Respostas:

2 para resposta № 1

Você pode pegar o valor na iteração para evitar procurar o valor com [], mas não é muito mais limpo:

max((sum(c.values()), key) for key, c in x.items())

Você pode fornecer o max com uma função que pareça legal se você quiser apenas retornar a chave da entrada max:

max(x, key=lambda k: sum(x[k].values()))

2 para resposta № 2

[] são desnecessários

print ( max((sum(x[ng].values()), ng) for ng in x)[1] )

Limpar com .items ()

print ( max((sum(v.values()), k) for k,v in x.items())[1] )

Versão max w / lambda

print ( max(x, key=lambda y: sum(x[y].values())) )

o map método

print ( max(map(lambda ng: (sum(x[ng].values()), ng), x))[1] )