如何在多层python字典中找到最小值,以及它的“路径”(即叶值的键列表)
我有以下格式的python字典:如何在多层python字典中找到最小值,以及它的“路径”(即叶值的键列表),python,sorting,dictionary,Python,Sorting,Dictionary,我有以下格式的python字典: d = { 'category' : { 'genre': <int_value> } } …结果应该是自由,冒险,23 有人能想出一个单班轮吗 提前谢谢 最直接的方法通常是最好的: def find_smallest(d): result = None, None, float('inf') for category in d: for genre, value in d[category].
d =
{
'category' :
{
'genre': <int_value>
}
}
…结果应该是自由,冒险,23
有人能想出一个单班轮吗
提前谢谢 最直接的方法通常是最好的:
def find_smallest(d):
result = None, None, float('inf')
for category in d:
for genre, value in d[category].items():
if value < result[2]:
result = category, genre, value
return result
最直接的方法通常是最好的:
def find_smallest(d):
result = None, None, float('inf')
for category in d:
for genre, value in d[category].items():
if value < result[2]:
result = category, genre, value
return result
您可以编写递归生成所有可能路径的生成器:
from operator import itemgetter
d = {
'free': {
'adventure' : 23,
'arcade' : 101,
},
'paid': {
'arcade' : 130,
}
}
def get_paths(d):
for key, value in d.items():
if isinstance(value, dict):
for path in get_paths(value):
yield (key,) + path
else:
yield (key, value)
print min(get_paths(d), key=itemgetter(-1))
尽管这可能有点过分,因为您的字典嵌套的深度不是任意的。您可以编写一个生成器,递归地生成所有可能的路径:
from operator import itemgetter
d = {
'free': {
'adventure' : 23,
'arcade' : 101,
},
'paid': {
'arcade' : 130,
}
}
def get_paths(d):
for key, value in d.items():
if isinstance(value, dict):
for path in get_paths(value):
yield (key,) + path
else:
yield (key, value)
print min(get_paths(d), key=itemgetter(-1))
print min((d[c][x], c, x) for c in d for x in d[c])
尽管这可能有点过头了,因为你的字典并没有嵌套得太深
print min((d[c][x], c, x) for c in d for x in d[c])
并重新安排:
print min( (d[c][x], x, c) for c in d for x in d[c] )[::-1]
并重新安排:
print min( (d[c][x], x, c) for c in d for x in d[c] )[::-1]
这适用于给定词典,但仅适用于具有相同嵌套级别的词典:
>>> min(((k, k2, v) for k, dct in d.items() for k2, v in dct.items()), key=lambda i: i[-1])
('free', 'adventure', 23)
或另一种解决方案:
>>> min((v, k2, k) for k, dct in d.items() for k2, v in dct.items())[::-1]
('free', 'adventure', 23)
这适用于给定词典,但仅适用于具有相同嵌套级别的词典:
>>> min(((k, k2, v) for k, dct in d.items() for k2, v in dct.items()), key=lambda i: i[-1])
('free', 'adventure', 23)
或另一种解决方案:
>>> min((v, k2, k) for k, dct in d.items() for k2, v in dct.items())[::-1]
('free', 'adventure', 23)
用递归函数很容易解决这个问题。它不是一行,但仍然很简单:
def min_int_value(nested_dict):
min_path = None
min_value = float("inf")
for k, v in nested_dict.items(): # use iteritems() in Python 2
path = [k]
if isinstance(v, dict):
p, v = min_int_value(v)
path += p
if v < min_value:
min_path = path
min_value = v
return min_path, min_value
用递归函数很容易解决这个问题。它不是一行,但仍然很简单:
def min_int_value(nested_dict):
min_path = None
min_value = float("inf")
for k, v in nested_dict.items(): # use iteritems() in Python 2
path = [k]
if isinstance(v, dict):
p, v = min_int_value(v)
path += p
if v < min_value:
min_path = path
min_value = v
return min_path, min_value
dict是一个内置名称,我将其更改为ddoes这仅适用于该示例?我正在寻找一种适用于字典中任意深度级别的解决方案,以防我需要修改其结构。请注意,您接受的答案仅适用于一层。dict是一个内置名称,我将其更改为DDoS这仅适用于示例?我正在寻找一种适用于字典中任意深度级别的解决方案,以防我需要修改其结构。请注意,您接受的答案仅适用于一层以下,与我完全相同的解决方案也适用于任意数量的层+1哇,与我完全相同的解决方案也适用于任意数量的层+1你是对的,这是你实际问到的问题的解决方案。我没有问,但我不确定OP是否需要该功能。获得一个适用于任意层数的解决方案会很好,但该解决方案确实满足规定的要求:你是对的,这是你实际问到的问题的解决方案。我没有问,但我不确定OP是否需要该功能。获得一个适用于任意层数的解决方案会很好,但该解决方案确实满足规定的要求:我喜欢它,尽管它返回23个“免费”,“冒险”:PI会去掉括号,将列表理解转化为生成器。此外,您还可以在末尾添加[:-1]来翻转生成的元组。甜美、非常简洁的解决方案!我喜欢它,即使它返回23个“free”,“adventure”:PI会去掉括号,将列表理解转换为生成器。此外,您还可以在末尾添加[:-1]来翻转生成的元组。甜美、非常简洁的解决方案!