我有一个以下格式的python字典:
d =
{
'category' :
{
'genre': <int_value>
}
}
我想找到最小的<int_value>
,以及原始字典中的“路径”。
E.g。如果
d =
{
'free':
{
'adventure' : 23,
'arcade' : 101,
},
'paid':
{
'arcade' : 130,
}
}
...结果应为("free", "adventure", 23)
。
有人可以为此考虑单行吗?
提前致谢!
答案 0 :(得分:5)
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]
答案 1 :(得分:3)
您可以编写一个递归生成所有可能路径的生成器:
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))
虽然这可能有点矫枉过正,因为你的字典没有任意嵌套。
答案 2 :(得分:3)
这适用于给定的字典(仅适用于具有相同嵌套级别的字典):
>>> 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)
答案 3 :(得分:0)
最直接的方式通常是最好的方式:
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
答案 4 :(得分:0)
使用递归函数解决这个问题非常容易。它不是单行,但仍然非常简单:
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