【问题标题】:Find all the keys and keys of the keys in a nested dictionary查找嵌套字典中的所有键和键的键
【发布时间】:2017-12-05 10:26:29
【问题描述】:

我正在尝试在 Python 的嵌套字典中查找数据的所有属性。一些对象的键定义可能有多个级别。我怎样才能找到如此复杂的嵌套数据的表头(如果我们认为是表结构)。以下是我的数据的几行,看看它的样子:

{"MessageType": "SALES.HOLDCREATED", "Event": {"Id": "ZWbDoMKQw6HDjFzCo8KuwpNmwofCjl7Co8OPwpDCncOSXMOdccKTZVVWZWbCnA==", "RefInfo": {"TId": {"Id": "ZMKXwpbClsOhwpNiw5E="}, "UserId": {"Id": "wpzCksKWwpbCpMKTYsKeZMKZbA=="}, "SentUtc": "2013-04-28T16:59:48.6698042", "Source": 1}, "ItemId": {"Id": 116228}, "Quantity": 1, "ExpirationDate": "2013-04-29T", "Description": null}}
{"MessageType": "SALES.SALEITEMCREATED", "Event": {"Id": "ZWbDoMKQw6HDjFzCo8KuwpNmwofCjl7Co8OPwpDCncOSXMOdccKTwp3CiFZkZMKWwpfCpMKZ", "RefInfo": {"TId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-04T", "Source": 1}, "Code": {"Code": "074108235206"}, "Sku": {"Sku": "Con CS54"}}}
{"MessageType": "SALES.SALEITEMCREATED", "Event": {"Id": "ZWbDoMKQw6HDjFzCo8KuwpNmwofCjl7Co8OPwpDCncOSXMOdccKTZcKHVsKcwpjClsKXwqTCmQ==", "RefInfo": {"TId": {"Id": "ZGA="}, "UserId": {"Id": "ZMKj"}, "SentUtc": "2013-01-04T", "Source": 1}, "Code": {"Code": "4000000021"}, "Sku": {"Sku": "NFL-Wallet-MK-2201"}}}

由于这个数据首先是Json格式,所以我改变了格式并试图找到关键:

import json

data = []
with open("data.raw", "r") as f:
    for line in f:
        data.append(json.loads(line))

for lines in data:
    print(lines.keys())

但它给了我dict_keys(['Event', 'MessageType']) 的所有行。 我需要的(对于我附加的这些数据)是一个类似的列表:

'MessageType' 'Event_Id' 'Event_RefInfo_TId_Id'  'Event_RefInfo_UserId_Id' 'Event_RefInfo_SentUtc' 'Event_RefInfo_Source' 'Event_ItemId_Id' 'Event_ItemId_Quantity' 'Event_ItemId_ExpirationDate'     ...

数据很大,我只需要找出我有哪些属性。

【问题讨论】:

    标签: python json dictionary key


    【解决方案1】:

    您需要遍历嵌套的字典,您当前的方法只能到达根字典的键。

    您可以使用以下生成器函数来查找键并递归遍历嵌套字典:

    import json 
    from pprint import pprint
    
    def find_keys(dct):
        for k, v in dct.items():
            if isinstance(v, dict):
                # traverse nested dict
                for x in find_keys(v):
                    yield "{}_{}".format(k, x)
            else:
                yield k
    

    给定从您的 json 对象派生的字典列表,您可以在每个字典中找到键并将它们放在一个集合中,以便条目是唯一的:

    s = set()
    for d in json.loads(lst):
        s.update(find_keys(d))
    
    pprint(s)
    

    set(['Event_Code_Code',
         'Event_Description',
         'Event_ExpirationDate',
         'Event_Id',
         'Event_ItemId_Id',
         'Event_Quantity',
         'Event_RefInfo_SentUtc',
         'Event_RefInfo_Source',
         'Event_RefInfo_TId_Id',
         'Event_RefInfo_UserId_Id',
         'Event_Sku_Sku',
         'MessageType'])
    

    【讨论】:

    • 非常感谢。此功能完美运行。这是一个问题......当我将此方法应用于数据大小时,我可以将其读入我的内存,这没关系。当我想处理大数据时,新问题出现了。
    • 因为我必须使用 readlines() 来定义字符串列表,虽然我在打开文件时定义了缓冲大小,但它会读取整个文件(而不是唯一的缓冲区大小)。如何只读取我在打开函数的缓冲大小中定义的数据?
    猜你喜欢
    • 2012-04-06
    • 1970-01-01
    • 2019-08-22
    • 2011-02-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多