在内部嵌套的 defaultdict 中查找值总和的最大值
Finding the max of sum of the values in the inner nested defaultdict
给定一个 defaultdict(Counter)
这样的:
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})}
我可以这样访问元组键中的值:
>>> x[('a', 'z')]
Counter({'crazy': 1, 'lazy': 1})
如果我想在内部字典中找到值和最高的元组键,即Counter,我可以这样做:
>>> 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')
我认为获取最大值的步骤有点复杂。 是否有更直接的方法来获取内部嵌套 defaultdict 中值的总和的最大值?
注意尽可能不要从 x
重新创建另一个对象。这个样本很小,但 x
对象的实际大小可以包含 1,000,000 个键,内部计数器的大小可以是 10,000,000。
您可以在迭代中捕获值以避免使用 []
查找值,但它并没有那么干净:
max((sum(c.values()), key) for key, c in x.items())
如果你只想 return max 条目的键,你可以为 max 提供一个看起来不错的函数:
max(x, key=lambda k: sum(x[k].values()))
[]
不需要
print ( max((sum(x[ng].values()), ng) for ng in x)[1] )
使用 .items() 进行清理
print ( max((sum(v.values()), k) for k,v in x.items())[1] )
最大 w/lambda 版本
print ( max(x, key=lambda y: sum(x[y].values())) )
map
方法
print ( max(map(lambda ng: (sum(x[ng].values()), ng), x))[1] )
给定一个 defaultdict(Counter)
这样的:
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})}
我可以这样访问元组键中的值:
>>> x[('a', 'z')]
Counter({'crazy': 1, 'lazy': 1})
如果我想在内部字典中找到值和最高的元组键,即Counter,我可以这样做:
>>> 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')
我认为获取最大值的步骤有点复杂。 是否有更直接的方法来获取内部嵌套 defaultdict 中值的总和的最大值?
注意尽可能不要从 x
重新创建另一个对象。这个样本很小,但 x
对象的实际大小可以包含 1,000,000 个键,内部计数器的大小可以是 10,000,000。
您可以在迭代中捕获值以避免使用 []
查找值,但它并没有那么干净:
max((sum(c.values()), key) for key, c in x.items())
如果你只想 return max 条目的键,你可以为 max 提供一个看起来不错的函数:
max(x, key=lambda k: sum(x[k].values()))
[]
不需要
print ( max((sum(x[ng].values()), ng) for ng in x)[1] )
使用 .items() 进行清理
print ( max((sum(v.values()), k) for k,v in x.items())[1] )
最大 w/lambda 版本
print ( max(x, key=lambda y: sum(x[y].values())) )
map
方法
print ( max(map(lambda ng: (sum(x[ng].values()), ng), x))[1] )