Loop through all nested dictionary values?

前端 未结 12 1241
温柔的废话
温柔的废话 2020-11-22 09:16
for k, v in d.iteritems():
    if type(v) is dict:
        for t, c in v.iteritems():
            print \"{0} : {1}\".format(t, c)

I\'m trying to l

相关标签:
12条回答
  • 2020-11-22 09:35

    Here's a modified version of Fred Foo's answer for Python 2. In the original response, only the deepest level of nesting is output. If you output the keys as lists, you can keep the keys for all levels, although to reference them you need to reference a list of lists.

    Here's the function:

    def NestIter(nested):
        for key, value in nested.iteritems():
            if isinstance(value, collections.Mapping):
                for inner_key, inner_value in NestIter(value):
                    yield [key, inner_key], inner_value
            else:
                yield [key],value
    

    To reference the keys:

    for keys, vals in mynested: 
        print(mynested[keys[0]][keys[1][0]][keys[1][1][0]])
    

    for a three-level dictionary.

    You need to know the number of levels before to access multiple keys and the number of levels should be constant (it may be possible to add a small bit of script to check the number of nesting levels when iterating through values, but I haven't yet looked at this).

    0 讨论(0)
  • 2020-11-22 09:38

    A alternative solution to work with lists based on Scharron's solution

    def myprint(d):
        my_list = d.iteritems() if isinstance(d, dict) else enumerate(d)
    
        for k, v in my_list:
            if isinstance(v, dict) or isinstance(v, list):
                myprint(v)
            else:
                print u"{0} : {1}".format(k, v)
    
    0 讨论(0)
  • 2020-11-22 09:38

    I find this approach a bit more flexible, here you just providing generator function that emits key, value pairs and can be easily extended to also iterate over lists.

    def traverse(value, key=None):
        if isinstance(value, dict):
            for k, v in value.items():
                yield from traverse(v, k)
        else:
            yield key, value
    

    Then you can write your own myprint function, then would print those key value pairs.

    def myprint(d):
        for k, v in traverse(d):
            print(f"{k} : {v}")
    

    A test:

    myprint({
        'xml': {
            'config': {
                'portstatus': {
                    'status': 'good',
                },
                'target': '1',
            },
            'port': '11',
        },
    })
    

    Output:

    status : good
    target : 1
    port : 11
    

    I tested this on Python 3.6.

    0 讨论(0)
  • 2020-11-22 09:42

    Iterative solution as an alternative:

    def traverse_nested_dict(d):
        iters = [d.iteritems()]
    
        while iters:
            it = iters.pop()
            try:
                k, v = it.next()
            except StopIteration:
                continue
    
            iters.append(it)
    
            if isinstance(v, dict):
                iters.append(v.iteritems())
            else:
                yield k, v
    
    
    d = {"a": 1, "b": 2, "c": {"d": 3, "e": {"f": 4}}}
    for k, v in traverse_nested_dict(d):
        print k, v
    
    0 讨论(0)
  • 2020-11-22 09:44

    Here is pythonic way to do it. This function will allow you to loop through key-value pair in all the levels. It does not save the whole thing to the memory but rather walks through the dict as you loop through it

    def recursive_items(dictionary):
        for key, value in dictionary.items():
            if type(value) is dict:
                yield (key, value)
                yield from recursive_items(value)
            else:
                yield (key, value)
    
    a = {'a': {1: {1: 2, 3: 4}, 2: {5: 6}}}
    
    for key, value in recursive_items(a):
        print(key, value)
    

    Prints

    a {1: {1: 2, 3: 4}, 2: {5: 6}}
    1 {1: 2, 3: 4}
    1 2
    3 4
    2 {5: 6}
    5 6
    
    0 讨论(0)
  • 2020-11-22 09:46

    As said by Niklas, you need recursion, i.e. you want to define a function to print your dict, and if the value is a dict, you want to call your print function using this new dict.

    Something like :

    def myprint(d):
        for k, v in d.items():
            if isinstance(v, dict):
                myprint(v)
            else:
                print("{0} : {1}".format(k, v))
    
    0 讨论(0)
提交回复
热议问题