您好我试图通过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中的键
原文链接:https://www.f2er.com/python/438454.html转换为保留元素顺序的容器
您只能对维护元素顺序的结构进行排序,例如列表,例如有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': []}]
>>>