Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
910 views
in Technique[技术] by (71.8m points)

python: Convert a for loop into a recursion function

First of all, I'm still a newb to python so please take it easy on me.

I've done my research and I have a basic understanding of how to write a recursive function, but I'm totally confused at the task ahead of me.

I would really like some tips and pointers so I can do this myself to really understand.

Here's the task:

  1. Iterate through a dictionary
  2. check if there is a 'children' key
  3. if true, do something
  4. repeat

Here's the issue,

The 'option' key is nested in another key called 'children'. There for I would like to iterate through each 'children' key until they exist no more.

Here's what the code looks like without recursion. Of course it fails because its too explicate, too rigid.

#level(one/two/three) refer to the level of nesting, easier for me to know where I am     in the loop.
#qdf_v2 is a particular type of file which is essentially a dictionary 

for levelone in qdf_v2['children']:
    if 'children' in levelone:
        store = options
        for leveltwo in levelone['children']:
            if 'children' in leveltwo:
                store = options
                for levelthree in leveltwo['children']:
                    if 'children' in levellevel:
                        repeat....

I would like to loop through the dictionary and it's 'children' key until they don't exist anymore.

Here's some JSON you can copy and past this in http://www.jsoneditoronline.org/ to see what I'm working with.

{
    "base": "http://panoptic-fearless.ldc.yougov.net/questionnaires/Test_maj_demo_newG4_2/versions/12/",
    "children": [
        {
            "name": "one",
            "children": [
                {
                    "name": "measures",
                    "children": [
                        {
                            "type": "single",
                            "options": {
                                "sort_order": "asending",
                                "chart_layout": "5",
                                "chart_type": "bar",
                                "chart_color": "green"
                            },
                            "text": "How much would you say you like or dislike P.E. at school? ",
                            "name": "KYS_Q1",
                            "responses": {
                                "items": [
                                    {
                                        "code": 1,
                                        "text": "I love it",
                                        "element": "qdf:response"
                                    },
                                    {
                                        "code": 2,
                                        "text": "I like it",
                                        "element": "qdf:response"
                                    },
                                    {
                                        "code": 3,
                                        "text": "I don’t like it",
                                        "element": "qdf:response"
                                    },
                                    {
                                        "code": 4,
                                        "text": "I hate it",
                                        "element": "qdf:response"
                                    },
                                    {
                                        "code": 5,
                                        "text": "Don’t know",
                                        "element": "qdf:response"
                                    }
                                ],
                                "element": "qdf:response_group"
                            },
                            "element": "qdf:question",
                            "export": [
                                {
                                    "name": "KYS_Q1"
                                }
                            ]
                        },
                        {
                            "children": [
                                {
                                    "type": "single",
                                    "options": {
                                        "sort_order": "asending",
                                        "chart_layout": "4",
                                        "chart_type": "pie",
                                        "chart_color": "pink"
                                    },
                                    "text": "{multiple order="randomize" max=3} You said that you $event P.E. at school...<br/> Which THREE of the following are your MAIN reasons for not liking P.E. at school? (Please tick up to three options)",
                                    "name": "KYS_Q2",
                                    "responses": {
                                        "items": [
                                            {
                                                "code": 1,
                                                "text": "I don't like going outside in bad weather (e.g. in the cold, rain etc.)",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 2,
                                                "text": "I’m always picked last to join a team",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 3,
                                                "text": "I don't like my P.E. teacher/ don’t think they are very good",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 4,
                                                "text": "I’m not very good at it",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 5,
                                                "text": "I find the games/ sports we play boring",
                                                "element": "qdf:response"
                                            }
                                        ],
                                        "element": "qdf:response_group"
                                    },
                                    "element": "qdf:question",
                                    "export": [
                                        {
                                            "name": "KYS_Q2"
                                        }
                                    ]
                                },
                                {
                                    "type": "single",
                                    "options": {
                                        "sort_order": "asending",
                                        "chart_layout": "5",
                                        "chart_type": "line",
                                        "chart_color": "green"
                                    },
                                    "text": "{multiple order="randomize"} Below are some feelings that people can have about doing P.E. at school...<br/> Which of the following words describe how you feel about doing P.E. at school? (Please tick all that apply) ",
                                    "name": "KYS_Q3A",
                                    "responses": {
                                        "items": [
                                            {
                                                "code": 1,
                                                "text": "Stressed",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 2,
                                                "text": "Scared",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 3,
                                                "text": "Worried",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 4,
                                                "text": "Sick",
                                                "element": "qdf:response"
                                            },
                                            {
                                                "code": 5,
                                                "text": "Tiring ",
                                                "element": "qdf:response"
                                            }
                                        ],
                                        "element": "qdf:response_group"
                                    },
                                    "element": "qdf:question",
                                    "export": [
                                        {
                                            "name": "KYS_Q3A"
                                        }
                                    ]
                                }
                            ],
                            "element": "qdf:section"
                        },
                        {
                            "type": "single",
                            "options": {
                                "sort_order": "desending",
                                "chart_layout": "5",
                                "chart_type": "bar",
                                "chart_color": "green"
                            },
                            "text": "{single order="randomize"} You said that you $event P.E...<br/> Which ONE of the following is the main reason you like it? ",
                            "name": "KYS_Q4",
                            "responses": {
                                "items": [
                                    {
                                        "code": 1,
                                        "text": "I like getting outside/ not being in the classroom",
                                        "element": "qdf:response"
                                    },
                                    {
                                        "code": 2,
                                        "text": "I like my P.E. teacher",
                                        "element": "qdf:response"
                                    },
                                    {
                                        "code": 3,
                                        "text": "I’m good at it",
                                        "element": "qdf:response"
                                    },
                                    {
                                        "code": 4,
                  

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I would approach this as follows:

def recursive(input, output=None):
    if output is None:
        output = {} # container to store results
    if 'children' in input:
        # do whatever, add things to output
        recursive(input['children'], output)
    return output

This way, the output dictionary is accessible to all depths of iteration and gets returned with all contents at the end. This means that you don't have to explicitly deal with the return values of the recursive calls.

Depending on exactly what you have, it may look more like:

def recursive(input, output=None):
    if output is None:
        output = {} # container to store results
    if 'children' in input:
        for child in input['children']:
            # do whatever, add things to output
            recursive(child, output)
    return output    

And output may be a different container (e.g. list, set).


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...