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 № 1Você 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] )