加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

按特定值对python中的JSON进行排序

发布时间:2020-12-16 22:53:56 所属栏目:Python 来源:网络整理
导读:您好我试图通过python中的“data_two”字段对以下JSON进行排序: {"1.2.3.4": { "data_one": 1,"data_two": 8,"list_one": [],"list_two": [ "item_one" ],"data_three": "string1"},"5.6.7.8": { "data_one": 1,"data_two": 9,"data_three": "string1","dat

您好我试图通过python中的“data_two”字段对以下JSON进行排序:

{
"1.2.3.4": {
    "data_one": 1,"data_two": 8,"list_one": [],"list_two": [
        "item_one"
    ],"data_three": "string1"
},"5.6.7.8": {
    "data_one": 1,"data_two": 9,"data_three": "string1","data_four": "string2","data_five": "string3"
}
}

我尝试过使用类似的东西

entries = sorted(json_data['1.2.3.4'],key=lambda k: k['data_two'])

然而,我没有太多运气/不断混淆.我的最终目标是通过“data_two”值对所有json条目进行排序,其中JSON中每个条目的键是一个随机的IP字符串.我是JSON世界的新手,请原谅我,如果这是一个简单的问题,任何帮助将不胜感激.

谢谢

最佳答案
如果您可以控制数据的聚合方式,it’s better to have a list of dicts,并且IP将是数据dict {…,’ip’:’127.0.0.1′}内的值,而不是容器父dict中的键

转换为保留元素顺序的容器

您只能对维护元素顺序的结构进行排序,例如列表,例如有dict实现维护OrderedDict之类的顺序,例如

您可以随时转换为那些(如果慢/大数据可能不是您的首选)

转换为列表[(键,值),…]或列表[value,…]

一种可能的方法是检索dict中的所有值,然后返回这些值的列表,按您选择的字段排序

您还可以对ips_data.items()返回的(键,值)进行排序,但这将创建一个新列表.关键是IP,价值是IP数据

sorted_list_of_keyvalues = sorted(ips_data.items(),key=item[1]['data_two'])

上面的列表以[(key1,value1),(key2,value2),…]的形式出现

您还可以获取值并删除键

sorted_list_of_values = [item[1] for item in sorted_list_of_keyvalues]

此列表的形式为[value1,value2,…]

请注意,您可能认为您只能按值而不是(键.值)进行排序,但您的数据中包含IP密钥,您可能希望保留该值.

转换为OrderedDict

如果您绝对希望将结构保留为dict,则可以使用OrderedDict

from collections import OrderedDict
ordered_items = sorted(ips_data.items(),key=lambda item: item[1]['data_two'])
ordered_ips_data_dict = OrderedDict(ordered_items)

有序的dict行为就像一个dict,但是key和items迭代将保持元素的顺序.

或者,保留已排序的键列表,并按此顺序处理

或者,您可以将该字典的键排序到列表中,然后您可以按顺序处理该字典.优点是您不必复制/转换数据

>>> ips_data = {
... "1.2.3.4": {
...     "data_one": 1,...     "data_two": 8,...     "list_one": [],...     "list_two": [
...         "item_one"
...     ],...     "data_three": "string1"
... },... "5.6.7.8": {
...     "data_one": 1,...     "data_two": 9,...     "data_three": "string1",...     "data_four": "string2",...     "data_five": "string3"
... }
... }
>>> ips_data.keys()
['1.2.3.4','5.6.7.8']
>>> ips = ips_data.keys()

现在,您可以按字段data_two对键进行排序

>>> sorted_ips = sorted(ips,key=lambda ip: ips_data[ip]['data_two'],reverse=True)
>>> sorted_ips
['5.6.7.8','1.2.3.4']

排序后的密钥,您可以按照排序的密钥顺序执行您想要的dict,例如,按此顺序处理它可能比将dict复制到像列表这样的新结构更有效

# Trivial example of processing that just puts the values into a list   
>>> [ips_data[ip] for ip in sorted_ips]
[{'data_three': 'string1','data_two': 9,'data_five': 'string3','data_four': 'string2','list_two': ['item_one'],'data_one': 1},{'list_two': ['item_one'],'data_two': 8,'data_one': 1,'data_three': 'string1','list_one': []}]
>>> 

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读