Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.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中的多维Dict排序_Python_Sorting_Dictionary - Fatal编程技术网

Python中的多维Dict排序

Python中的多维Dict排序,python,sorting,dictionary,Python,Sorting,Dictionary,我有一个json示例: { "1_0": { "stand": { "bk": [ { "rate": "412.30" } ] }, "exec": { "bk": [ { "rate": "360.03" }, { "rate": "360.03" } ] } }, "2_0": { "stand": { "bk": [ { "rate": "824.60" }

我有一个json示例:

{
"1_0": {
"stand": {
  "bk": [
    {
      "rate": "412.30"
    }
  ]
},
"exec": {
  "bk": [
    {
      "rate": "360.03"
    },
    {
      "rate": "360.03"
    }
  ]
}
},
"2_0": {
"stand": {
  "bk": [
    {
      "rate": "824.60"
    }
  ]
},
"exec": {
  "bk": [
    {
      "rate": "720.06"
    },
    {
      "rate": "720.06"
    }
  ]
}
},
"3_0": {
"stand": {
  "bk": [
    {
      "rate": "483.13"
    }
  ]
},
"exec": {
  "bk": [
    {
      "rate": "412.30"
    },
    {
      "rate": "412.30"
    }
  ]
}
}
}
我一直在尝试根据键“1-0”、“2_0”等的“rate”标记对dict进行排序,因此我得到了如下结果:

预期产出

{
"1_0": {
"exec": {
  "bk": [
    {
      "rate": "360.03"
    },
    {
      "rate": "360.03"
    }
  ]
},"stand": {
  "bk": [
    {
      "rate": "412.30"
    }
  ]
}
},
"2_0": {
"exec": {
  "bk": [
    {
      "rate": "720.06"
    },
    {
      "rate": "720.06"
    }
  ]
},
"stand": {
  "bk": [
    {
      "rate": "824.60"
    }
  ]
}
},
"3_0": {
"exec": {
  "bk": [
    {
      "rate": "412.30"
    },
    {
      "rate": "412.30"
    }
  ]
},
"stand": {
  "bk": [
    {
      "rate": "483.13"
    }
  ]
}
}
}
下面是我尝试过的代码块,尽管它似乎不正确:

f = open('file.json',) 
data = json.load(f) 

for value in data.values():
    for x in value.values():
        for y in x.values():
            y.sort(key=lambda e: float(e['rate']))

我犯了什么错误,而且我知道嵌套for循环似乎不符合pythonic。

仍然不确定我是否正确理解您的需求,但这里有一个尝试

假设
d
是您的指令:

def subkey(subdict):
    return list(subdict)[0]

for k, v in d.items():
    d[k] = { k1: v[k1] for k1 in sorted(v, key=lambda x: v[x][subkey(v[x])][0]['rate']) }

请注意,它只在Python3.6+中工作,在此之前,dicts不能保证保持秩序。

仍然不确定我是否正确理解您的需求,但这里有一个尝试

假设
d
是您的指令:

def subkey(subdict):
    return list(subdict)[0]

for k, v in d.items():
    d[k] = { k1: v[k1] for k1 in sorted(v, key=lambda x: v[x][subkey(v[x])][0]['rate']) }
请注意,它只在Python3.6+中工作,在此之前,dicts不能保证保持秩序。

此代码可以提供帮助

for key, value in data.items():
    data[key]  = {'stand' : value['stand'], 'exec' : value['exec']} if float(value['stand']['bk'][0]['rate']) < float(value['exec']['bk'][0]['rate']) else {'exec' : value['exec'], 'stand' : value['stand']}
这段代码会有帮助

for key, value in data.items():
    data[key]  = {'stand' : value['stand'], 'exec' : value['exec']} if float(value['stand']['bk'][0]['rate']) < float(value['exec']['bk'][0]['rate']) else {'exec' : value['exec'], 'stand' : value['stand']}
你可以试试这个

>>> {key:value for key,value in l.iteritems()}
{'2_0': {'stand': {'bk': [{'rate': '824.60'}]}, 'exec': {'bk': [{'rate': '720.06'}, {'rate': '720.06'}]}}, '3_0': {'stand': {'bk': [{'rate': '483.13'}]}, 'exec': {'bk': [{'rate': '412.30'}, {'rate': '412.30'}]}}, '1_0': {'stand': {'bk': [{'rate': '412.30'}]}, 'exec': {'bk': [{'rate': '360.03'}, {'rate': '360.03'}]}}}
#give your sorting condition as key argument to sorted() 
>>> {key:dict(zip(value.keys(),sorted(value.values(),key=lambda v1: v1['bk'][0]['rate']))) for key,value in l.iteritems()}
{'2_0': {'stand': {'bk': [{'rate': '720.06'}, {'rate': '720.06'}]}, 'exec': {'bk': [{'rate': '824.60'}]}}, '3_0': {'stand': {'bk': [{'rate': '412.30'}, {'rate': '412.30'}]}, 'exec': {'bk': [{'rate': '483.13'}]}}, '1_0': {'stand': {'bk': [{'rate': '360.03'}, {'rate': '360.03'}]}, 'exec': {'bk': [{'rate': '412.30'}]}}}
你可以试试这个

>>> {key:value for key,value in l.iteritems()}
{'2_0': {'stand': {'bk': [{'rate': '824.60'}]}, 'exec': {'bk': [{'rate': '720.06'}, {'rate': '720.06'}]}}, '3_0': {'stand': {'bk': [{'rate': '483.13'}]}, 'exec': {'bk': [{'rate': '412.30'}, {'rate': '412.30'}]}}, '1_0': {'stand': {'bk': [{'rate': '412.30'}]}, 'exec': {'bk': [{'rate': '360.03'}, {'rate': '360.03'}]}}}
#give your sorting condition as key argument to sorted() 
>>> {key:dict(zip(value.keys(),sorted(value.values(),key=lambda v1: v1['bk'][0]['rate']))) for key,value in l.iteritems()}
{'2_0': {'stand': {'bk': [{'rate': '720.06'}, {'rate': '720.06'}]}, 'exec': {'bk': [{'rate': '824.60'}]}}, '3_0': {'stand': {'bk': [{'rate': '412.30'}, {'rate': '412.30'}]}, 'exec': {'bk': [{'rate': '483.13'}]}}, '1_0': {'stand': {'bk': [{'rate': '360.03'}, {'rate': '360.03'}]}, 'exec': {'bk': [{'rate': '412.30'}]}}}

你的预期产出是多少?您在
d[key]['exec']['bk']
d[key]['stand']['bk']
中都有“rate”键,那么您想如何处理它呢?我已经添加了预期的输出above@radix它可以正确地进行排序。您缺少一些详细信息。@sonus21什么详细信息?@您希望dict按速率键排序,而内部字典已排序。FWIW字典不维护键顺序,所以您的列表在这里排序。所以你必须提供你的期望值。你的期望值是多少?您在
d[key]['exec']['bk']
d[key]['stand']['bk']
中都有“rate”键,那么您想如何处理它呢?我已经添加了预期的输出above@radix它可以正确地进行排序。您缺少一些详细信息。@sonus21什么详细信息?@您希望dict按速率键排序,而内部字典已排序。FWIW字典不维护键顺序,所以您的列表在这里排序。因此,您必须提供您的期望值。如果标记“bk”是动态的,那么该代码将无法正常工作?不,当然不能。除了
“bk”
,您没有提到任何其他可能的值。我的错误是,值“bk”是示例,它可以是动态的。它仍然只是“exec”和“stand”键下的一个子键,还是可能有多个子键?如果是这样的话,这会如何影响预期的排序顺序?单个子键,但值不是静态的,其余的排序是精细的。如果标记“bk”是动态的,这段代码将无法正常工作?不,当然不会。除了
“bk”
,您没有提到任何其他可能的值。我的错误是,值“bk”是示例,它可以是动态的。它仍然只是“exec”和“stand”键下的一个子键,还是可能有多个子键?如果是这样,这会如何影响预期的排序顺序?单个子键但值不是静态的,其余排序是精细的标记(stand、exec、bk)是动态的,不能在代码级别定义它们。标记(stand、exec、bk)是动态的,不能在代码级别定义它们。