Get a list of all keys in nested dictionary

前端 未结 3 824
遇见更好的自我
遇见更好的自我 2021-01-15 12:13

I want to get a list of all keys in a nested dictionary that contains lists and dictionaries.

I currently have this code, but it seems to be missing adding some keys

相关标签:
3条回答
  • 2021-01-15 12:35

    This should do the job:

    def get_keys(dl, keys_list):
        if isinstance(dl, dict):
            keys_list += dl.keys()
            map(lambda x: get_keys(x, keys_list), dl.values())
        elif isinstance(dl, list):
            map(lambda x: get_keys(x, keys_list), dl)
    

    To avoid duplicates you can use set, e.g.:

    keys_list = list( set( keys_list ) )
    

    Example test case:

    keys_list = []
    d = {1: 2, 3: 4, 5: [{7: {9: 1}}]}
    get_keys(d, keys_list)
    print keys_list
    >>>> [1, 3, 5, 7, 9]
    
    0 讨论(0)
  • 2021-01-15 12:45

    Updating @MackM's response to Python 3 as dict.iteritems has been deprecated (and I prefer to use f-strings over the .format{} styling):

    keys_list = []
    def get_keys(d_or_l, keys_list):
        if isinstance(d_or_l, dict):
            for k, v in iter(sorted(d_or_l.items())):  #  Altered line to update deprecated method
                if isinstance(v, list):
                    get_keys(v, keys_list)
                elif isinstance(v, dict):
                    get_keys(v, keys_list)
                keys_list.append(k)   
        elif isinstance(d_or_l, list):
            for i in d_or_l:
                if isinstance(i, list):
                    get_keys(i, keys_list)
                elif isinstance(i, dict):
                    get_keys(i, keys_list)
        else:
            print(f'** Skipping item of type: {type(d_or_l)}')  #  Altered line to use f-strings
        return keys_list
    
    
    unique_keys = list(set(get_keys(my_json_dict, keys_list)))  # Added line as example use case
    
    0 讨论(0)
  • 2021-01-15 12:54

    As it stands, your code ignores keys that lead to list or dict values. Remove the else block in your first for loop, you want to add the key no matter what the value is.

    keys_list = []
    def get_keys(d_or_l, keys_list):
        if isinstance(d_or_l, dict):
            for k, v in iter(sorted(d_or_l.iteritems())):
                if isinstance(v, list):
                    get_keys(v, keys_list)
                elif isinstance(v, dict):
                    get_keys(v, keys_list)
                keys_list.append(k)   #  Altered line
        elif isinstance(d_or_l, list):
            for i in d_or_l:
                if isinstance(i, list):
                    get_keys(i, keys_list)
                elif isinstance(i, dict):
                    get_keys(i, keys_list)
        else:
            print "** Skipping item of type: {}".format(type(d_or_l))
        return keys_list
    

    get_keys({1: 2, 3: 4, 5: [{7: {9: 1}}]}, keys_list) returns [1, 3, 9, 7, 5]

    To avoid duplication, you could use a set datatype instead of a list.

    0 讨论(0)
提交回复
热议问题