繁体   English   中英

Python中的多维字典排序

[英]Sorting Multidimensional Dict in Python

我有一个样品 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”等的“速率”标签对字典进行排序,这样我就有了类似的东西:

预期 Output

{
"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']) }

请注意,它仅在 Python 3.6+ 中有效,在此之前不能保证字典保持秩序。

此代码可以提供帮助

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']}

返回

{'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'}]}}}

你可以试试这个

>>> {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'}]}}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM