我在这个论坛上搜索过很多东西,但是对于这个特殊的问题我还没有找到任何解决方案。假设我有一个像这样的字典:
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。有什么想法吗?
答案 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)