Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在多层python字典中找到最小值,以及它的“路径”(即叶值的键列表)_Python_Sorting_Dictionary - Fatal编程技术网

如何在多层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].

我有以下格式的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].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]来翻转生成的元组。甜美、非常简洁的解决方案!