在元组中以固定元素为键的字典中找到最大值

时间:2019-03-04 10:38:54

标签: python dictionary

我在这个论坛上搜索过很多东西,但是对于这个特殊的问题我还没有找到任何解决方案。假设我有一个像这样的字典:

d = {}

d['a', 0] = 0.12
d['a', 1] = 0.23
d['a', 2] = 0.53
d['b', 4] = 0.23
d['b', 5] = 0.40
d['b', 6] = 0.39

如何找到与固定的第一个元素的最大值对应的键?例如,如果我想找到元组的第二个元素,该元素为我提供了固定'b'的最大值,该怎么办? (在这种情况下,它应返回5,因为0.40是最大值)。

我尝试了max(d, key=d.get)[1],但这为我提供了所有值中最大值的键,所以2。有什么想法吗?

4 个答案:

答案 0 :(得分:1)

您必须基本上迭代所有键/​​值对:

def find_max_second_key(d, first_key):
    return max((v, k2) for (k1, k2), v in d.items() if k1 == first_key)[1]

d = {}

d['a', 0] = 0.12
d['a', 1] = 0.23
d['a', 2] = 0.53
d['b', 4] = 0.23
d['b', 5] = 0.40
d['b', 6] = 0.39

print(find_max_second_key(d, 'a'))
# 2
print(find_max_second_key(d, 'b'))
# 5

或者,您可以将字典转换为嵌套结构。这样,您只需要使用匹配的第一个键来遍历项目。

d = {}

d['a', 0] = 0.12
d['a', 1] = 0.23
d['a', 2] = 0.53
d['b', 4] = 0.23
d['b', 5] = 0.40
d['b', 6] = 0.39

d_nested = {}
for (k1, k2), v in d.items():
    d_nested.setdefault(k1, {})[k2] = v
print(d_nested)
# {'a': {0: 0.12, 1: 0.23, 2: 0.53}, 'b': {4: 0.23, 5: 0.4, 6: 0.39}}

print(max(d_nested['a'], key=d_nested['a'].get))
# 2
print(max(d_nested['b'], key=d_nested['b'].get))
# 5

答案 1 :(得分:1)

尝试一下:

print([i[1] for i in d if d[i] == max([k for j,k in d.items() if j[0] == 'a'])][0])

它返回最大可能值的字典键(元组)的第二个项目的最大值。如果我们搜索具有第一个元素为'a'的键的字典值,则会得到0.12, 0.23, 0.53。其中0.53是最高的,因此我们打印出包含值0.53的tuple(key)的第二项。

答案 2 :(得分:1)

如果要基于字典中键的值进行排序

def func(d,key):
    new_dic = {}
    for k,v in d.items():       
        if key in k :
            new_dic.update({k:v})
    return max(new_dic, key=lambda x:new_dic[x])

d = {}

d['a', 0] = 0.12
d['a', 1] = 0.23
d['a', 2] = 0.53
d['b', 4] = 0.23
d['b', 5] = 0.40
d['b', 6] = 0.39



print(func(d, 'b'))
# output ('b', 5) 

否则,如果您想使用整体结果

max(d,key=lambda x:d[x])

答案 3 :(得分:1)

您可以使用以下键:

d = {('a', 0): 0.12, ('a', 1): 0.23, ('a', 2): 0.53, ('b', 4): 0.23, ('b', 5): 0.4, ('b', 6): 0.39}

k = 'b'
max(d, key=lambda x: d[x] if x[0] == k else float("-inf"))
# ('b', 5)