Search code examples
pythonstringdictionaryunicodekey-value-store

Python: Getting all strings inside dictionary structure


WARNING: This is still Python 2.7!

For some reason the following function has extremely slow runtime:

def get_content(d,content):
    if isinstance(d,unicode):
        content += d
        content += u'\n'
    elif isinstance(d,dict):
        for key in d:
            content += get_content(d[key],content)
    elif isinstance(d,list):
        for el in d:
            content += get_content(el,content)
    return content

content = get_content(D,u'')

That is although D is quite small. Nothing crazy going on there size-wise.

Do you see what the problem is or what would be a better way to solve the task?

EDIT: I changed the code to ...

def get_content(d,content):
    if isinstance(d,unicode):
        content += [d]
    elif isinstance(d,dict):
        for key in d:
            content += get_content(d[key],content)
    elif isinstance(d,list):
        for el in d:
            content += get_content(el,content)
    return content

content = get_content(D,[])

... and it still has the same problem.


Solution

  • The problem is that you are reappending the whole content at each recursion. To solve pass an empty list to each get_content call instead.

    def get_content(d,content):
        if isinstance(d,unicode):
            content += [d]
        elif isinstance(d,dict):
            for key in d:
                content += get_content(d[key],[])
        elif isinstance(d,list):
            for el in d:
                content += get_content(el,[])
        return content
    
    content = get_content(D,[])