1

我有以下格式的python字典:

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

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

例如,如果

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

...结果应该是("free", "adventure", 23)

任何人都可以为此想到一个单行字吗?

提前致谢!

4

5 回答 5

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]
于 2013-04-21T03:46:22.020 回答
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))

尽管这可能有点矫枉过正,因为您的字典没有嵌套任意深度。

于 2013-04-21T03:44:22.810 回答
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)
于 2013-04-21T03:46:56.580 回答
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
于 2013-04-21T03:43:51.717 回答
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
于 2013-04-21T03:49:17.617 回答