从嵌套的默认字典中获取最大值

时间:2017-02-01 06:18:24

标签: python python-3.x nested max defaultdict

我试图使用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)))

非常感谢任何见解。非常感谢。

2 个答案:

答案 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)