如何在多层python字典中找到最小值,以及它的“路径”(即叶子值的键列表)

时间:2013-04-21 03:37:59

标签: python sorting dictionary

我有一个以下格式的python字典:

d = 
{
  'category' :
  {
    'genre': <int_value>
  }
}

我想找到最小的<int_value>,以及原始字典中的“路径”。

E.g。如果

d = 
{
  'free':
  {
    'adventure' : 23,
    'arcade' : 101,
  },
  'paid':
  {
    'arcade' : 130,
  }
}

...结果应为("free", "adventure", 23)

有人可以为此考虑单行吗?

提前致谢!

5 个答案:

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