我试图使用Python3从默认字典的默认字典中的每个字典中获取最大值。
字典设置:
d = defaultdict(lambda: defaultdict(int))
我的迭代器遍历字典和csv数据我很好用,但是当我调用max时,它并不一定每次都返回最大值。
示例输出:
defaultdict(<class 'int'>, {0: 106, 2: 35, 3: 12})
max = (0, 106)
defaultdict(<class 'int'>, {0: 131, 1: 649, 2: 338, 3: 348, 4: 276, 5: 150, 6: 138, 7: 89, 8: 54, 9: 22, 10: 5, 11: 2})
max = (0, 131)
defaultdict(<class 'int'>, {0: 39, 1: 13, 2: 30, 3: 15, 4: 5, 5: 10, 6: 1, 8: 1})
max = (0, 39)
defaultdict(<class 'int'>, {0: 40, 1: 53, 2: 97, 3: 80, 4: 154, 5: 203, 6: 173, 7: 142, 8: 113, 9: 76, 10: 55, 11: 22, 12: 13, 13: 7})
max = (0, 40)
所以有时它是正确的,但远非完美。
我的方法是通过this问题的答案得到的,但我对其进行了调整以尝试使其适用于嵌套的默认字典。这是我用来查找max:
的代码for sub_d in d:
outer_dict = d[sub_d]
print(max(outer_dict.items(), key=lambda x: outer_dict.get(x, 0)))
非常感谢任何见解。非常感谢。
答案 0 :(得分:0)
如果你检查outer_dict.items()中的值,它们实际上由键值元组组成,因为它们不在你的字典中,它们都返回0,因此返回索引0。
max(a.keys(),key = lambda x: a.get(x,0))
将获取最大值的索引,并通过查找字典来检索值
答案 1 :(得分:0)
在
max(outer_dict.items(), key=lambda x: outer_dict.get(x, 0))
outer_dict.items()
调用返回一个迭代器,它生成outer_dict
中项目的(key,value)元组。因此key
函数传递一个(key,value)元组作为其x
参数,然后尝试在outer_dict
中找到该元组作为关键字,当然那个&#39;不会成功,所以get
调用总是返回0.
相反,我们可以使用从元组中提取值的键函数。例如:
nested = {
'a': {0: 106, 2: 35, 3: 12},
'b': {0: 131, 1: 649, 2: 338, 3: 348, 4: 276, 5: 150, 6: 138, 7: 89,
8: 54, 9: 22, 10: 5, 11: 2},
'c': {0: 39, 1: 13, 2: 30, 3: 15, 4: 5, 5: 10, 6: 1, 8: 1},
'd': {0: 40, 1: 53, 2: 97, 3: 80, 4: 154, 5: 203, 6: 173, 7: 142,
8: 113, 9: 76, 10: 55, 11: 22, 12: 13, 13: 7},
}
for k, subdict in nested.items():
print(k, max((t for t in subdict.items()), key=lambda t: t[1]))
<强>输出强>
a (0, 106)
b (1, 649)
c (0, 39)
d (5, 203)
更有效的替代lambda是使用itemgetter
。这是一个将最大值放入字典的版本:
from operator import itemgetter
nested = {
'a': {0: 106, 2: 35, 3: 12},
'b': {0: 131, 1: 649, 2: 338, 3: 348, 4: 276, 5: 150, 6: 138, 7: 89,
8: 54, 9: 22, 10: 5, 11: 2},
'c': {0: 39, 1: 13, 2: 30, 3: 15, 4: 5, 5: 10, 6: 1, 8: 1},
'd': {0: 40, 1: 53, 2: 97, 3: 80, 4: 154, 5: 203, 6: 173, 7: 142,
8: 113, 9: 76, 10: 55, 11: 22, 12: 13, 13: 7},
}
ig1 = itemgetter(1)
maxes = {k: max((t for t in subdict.items()), key=ig1)
for k, subdict in nested.items()}
print(maxes)
<强>输出强>
{'a': (0, 106), 'b': (1, 649), 'c': (0, 39), 'd': (5, 203)}
我们在字典理解之外定义ig1
,这样我们就不会在外循环的每次迭代中调用itemgetter(1)
。