簡體   English   中英

按特定值對python中的JSON進行排序

[英]Sorting JSON in python by a specific value

您好我試圖通過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"
}
}

我嘗試過使用類似的東西

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

然而,我沒有太多運氣/不斷混淆。 我的最終目標是通過“data_two”值對所有json條目進行排序,其中JSON中每個條目的鍵是一個隨機的IP字符串。 我是JSON世界的新手,請原諒我,如果這是一個簡單的問題,任何幫助將不勝感激。

謝謝

如果你有過如何將數據匯總控制, 最好是有類型的字典列表 ,而IP將是數據字典中的 {..., 'ip': '127.0.0.1'}而不是關鍵在容器父dict中

轉換為保留元素順序的容器

您只能對維護元素順序的結構進行排序,例如list例如,存在像OrderedDict一樣維護順序的dict實現

您可以隨時轉換為那些(如果慢/大數據可能不是您的首選)

轉換為列表[(鍵,值),...]或列表[value,...]

一種可能的方法是檢索dict中的所有值,然后返回這些值的列表,按您選擇的字段排序

您還可以對by ips_data.items()返回的(key, value) by ips_data.items() ,但這將創建一個新列表。 key是IP, value是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,
...     "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()

現在,您可以按字段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': []}]
>>> 

看起來你嘗試的非常接近。 下面將為您提供一個排序的元組列表,其中鍵位於第0位,值(位於字典中)位於第1位。 你應該能夠使用它來做你想做的事情。

entries = sorted(json_data.items(), key=lambda items: items[1]['data_two'])

所以舉個例子

{ "k1": {"data_one": 1, "data_two": 50 ...}, "k2": {"data_one": 50, "data_two": 2}}

會導致:

[("k2", {..."data_two": 2...}), ("k1", {..."data_two": 50...})]

希望有所幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM