Lin*_*696 5 python json python-2.7
您好我试图通过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,
"list_two": [
"item_one"
],
"data_three": "string1",
"data_four": "string2",
"data_five": "string3"
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试过使用类似的东西
entries = sorted(json_data['1.2.3.4'], key=lambda k: k['data_two'])
Run Code Online (Sandbox Code Playgroud)
然而,我没有太多运气/不断混淆.我的最终目标是通过"data_two"值对所有json条目进行排序,其中JSON中每个条目的键是一个随机的IP字符串.我是JSON世界的新手,请原谅我,如果这是一个简单的问题,任何帮助将不胜感激.
谢谢
如果您可以控制数据的聚合方式,最好有一个 dicts 列表,并且 IP 将是数据 dict 内的值{..., 'ip': '127.0.0.1'},而不是容器父 dict 中的键
您只能对维护元素顺序的结构进行排序,例如,list有一些dict实现可以维护顺序,OrderedDict例如
您始终可以转换为这些(如果数据缓慢/大,可能不是您的首选)
转换为列表 [(key, value), ...] 或列表 [value, ...]
一种可能的方法是检索字典中的所有值,然后返回这些值的列表,按您选择的字段排序
您还可以对(key, value)返回的进行排序by ips_data.items(),但这将创建一个新列表。key是IP,value是IP数据
sorted_list_of_keyvalues = sorted(ips_data.items(), key=item[1]['data_two'])
Run Code Online (Sandbox Code Playgroud)
上面的列表形式为[(key1, value1), (key2, value2), ...]
您还可以提取值并删除键
sorted_list_of_values = [item[1] for item in sorted_list_of_keyvalues]
Run Code Online (Sandbox Code Playgroud)
该列表的形式为[value1, value2, ...]
请注意,您可能认为您可以仅按值而不是 (key.value) 进行排序,但您的数据的键中包含 IP,您可能希望保留它。
转换为 OrderedDict
如果你绝对想将结构保留为字典,你可以使用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)
Run Code Online (Sandbox Code Playgroud)
有序字典的行为就像字典一样,但键和项目迭代将保持元素的顺序。
或者,您可以将该字典的键排序到列表中,然后可以按该顺序处理该字典。优点是您不必复制/转换数据
>>> 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,
... "list_two": [
... "item_one"
... ],
... "data_three": "string1",
... "data_four": "string2",
... "data_five": "string3"
... }
... }
>>> ips_data.keys()
['1.2.3.4', '5.6.7.8']
>>> ips = ips_data.keys()
Run Code Online (Sandbox Code Playgroud)
现在您可以按字段对键进行排序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']
Run Code Online (Sandbox Code Playgroud)
排序后的键,您可以按照排序键的顺序对字典执行您想要的操作,例如按此顺序处理它可能比将字典复制到列表等新结构中更有效
# 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': []}]
>>>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3085 次 |
| 最近记录: |