首先,我仍然是python的新手,所以请放轻松我。
我已经完成了我的研究,并且我对如何编写递归函数有了基本的了解,但我对我前面的任务感到困惑。
我真的很喜欢一些提示和指示,所以我可以自己做这个来真正理解。
这是任务:
这是问题,
'option'键嵌套在另一个名为'children'的键中。在那里,我想迭代每个'儿童'键,直到它们不再存在。
这是没有递归的代码。当然它失败了,因为它过于陈述,过于僵化。
#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....
我想循环通过字典,它是'儿童'键,直到它们不再存在。
以下是您可以在http://www.jsoneditoronline.org/中复制和过去的一些JSON,以了解我正在使用的内容。
{
"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,
"text": "I find the games/ sports fun",
"element": "qdf:response"
},
{
"code": 5,
"text": "I find the games/ sports easy",
"element": "qdf:response"
}
],
"element": "qdf:response_group"
},
"element": "qdf:question",
"export": [
{
"name": "KYS_Q4"
}
]
}
],
"element": "qdf:page"
}
],
"element": "qdf:module"
},
{
"name": "two",
"children": [
{
"name": "test",
"children": [
{
"type": "single",
"options": {
"sort_order": "asending",
"chart_layout": "5",
"chart_type": "bar",
"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_Q5A",
"responses": {
"items": [
{
"code": 1,
"text": "Energised/ Awake",
"element": "qdf:response"
},
{
"code": 2,
"text": "Excited",
"element": "qdf:response"
},
{
"code": 3,
"text": "Relaxed",
"element": "qdf:response"
},
{
"code": 4,
"text": "Confident",
"element": "qdf:response"
},
{
"code": 5,
"text": "Happy",
"element": "qdf:response"
}
],
"element": "qdf:response_group"
},
"element": "qdf:question",
"export": [
{
"name": "KYS_Q5A"
}
]
},
{
"type": "single",
"options": {
"sort_order": "asending",
"chart_layout": "25",
"chart_type": "column",
"chart_color": "orange"
},
"text": "{multiple order=\"randomize\"} For the following question please do not be afraid to be as honest as possible, no one else will be told your personal answers. <br/> Which of the following have you EVER done in order to avoid taking part in P.E. at school? (Please tick all that apply) ",
"name": "KYS_Q6",
"responses": {
"items": [
{
"code": 1,
"text": "Lied about forgetting my kit",
"element": "qdf:response"
},
{
"code": 2,
"text": "Lied about an injury",
"element": "qdf:response"
},
{
"code": 3,
"text": "Lied about feeling unwell",
"element": "qdf:response"
},
{
"code": 4,
"text": "Faked a note from my parents/ guardian",
"element": "qdf:response"
},
{
"code": 5,
"text": "Faked a note from my doctor/ health professional",
"element": "qdf:response"
}
],
"element": "qdf:response_group"
},
"element": "qdf:question",
"export": [
{
"name": "KYS_Q6"
}
]
},
{
"type": "single",
"options": {
"sort_order": "asending",
"chart_layout": "5",
"chart_type": "bar",
"chart_color": "green"
},
"text": "{multiple order=\"randomize\"} For the following question, please think about the teacher who has taught you P.E. MOST recently and if you have more than one teacher teaching you P.E. please think about the one who has taught you most often. <br/> Which of the following statements do you agree with? (Please tick all that apply)",
"name": "KYS_Q7",
"responses": {
"items": [
{
"code": 1,
"text": "My P.E. teacher inspires me to do more exercise",
"element": "qdf:response"
},
{
"code": 2,
"text": "My P.E. teacher motivates me to take part in P.E. lessons",
"element": "qdf:response"
},
{
"code": 3,
"text": "My P.E. teacher scares me",
"element": "qdf:response"
},
{
"code": 4,
"text": "My P.E. teacher makes P.E. boring",
"element": "qdf:response"
},
{
"code": 5,
"text": "My P.E. teacher makes P.E. fun",
"element": "qdf:response"
},
{
"code": 6,
"text": "My P.E. teacher makes P.E. difficult/ hard",
"element": "qdf:response"
}
],
"element": "qdf:response_group"
},
"element": "qdf:question",
"export": [
{
"name": "KYS_Q7"
}
]
},
{
"type": "single",
"options": {
"sort_order": "asending",
"chart_layout": "5",
"chart_type": "bar",
"chart_color": "green"
},
"text": "{multiple order=\"randomize\"} What would make you like P.E. more? (Please tick all that apply)",
"name": "KYS_Q8",
"responses": {
"items": [
{
"code": 1,
"text": "If the P.E. teacher was nicer to me",
"element": "qdf:response"
},
{
"code": 2,
"text": "If more lessons took place indoors (e.g. in the sports hall or a gym)",
"element": "qdf:response"
},
{
"code": 3,
"text": "If more lessons took place outdoors",
"element": "qdf:response"
},
{
"code": 4,
"text": "If we did more interesting sports/ activities",
"element": "qdf:response"
},
{
"code": 5,
"text": "If we had more choice of the types of sport we had to do",
"element": "qdf:response"
},
{
"code": 6,
"text": "If we could wear what we wanted for the lesson",
"element": "qdf:response"
},
{
"options": {
"fixed": true
},
"children": [
{
"export": [
{
"name": "KYS_Q8other"
}
],
"name": "KYS_Q8other",
"type": "open",
"element": "qdf:question"
}
],
"code": 7,
"text": "Other ",
"element": "qdf:response"
},
{
"options": {
"xor": true,
"fixed": true
},
"code": 8,
"text": "Don’t know",
"element": "qdf:response"
},
{
"options": {
"xor": true,
"fixed": true
},
"code": 9,
"text": "Not applicable – nothing would make me like P.E. more than I already do",
"element": "qdf:response"
}
],
"element": "qdf:response_group"
},
"element": "qdf:question",
"export": [
{
"name": "KYS_Q8"
}
]
}
],
"element": "qdf:page"
}
],
"element": "qdf:module"
},
{
"children": [
{
"children": [
{
"text": "\n",
"element": "qdf:text"
}
],
"element": "qdf:page"
}
],
"element": "qdf:module"
}
],
"panelid": 13,
"created": "#2014-01-10T15:57:18.594000+00:00#",
"typespec": {
"src": "/questionnaires/typespecs/initial.qdf",
"element": "qdf:typespec"
},
"qdf-ext:ext": [
"meaningful-page-names"
],
"element": "qdf:questionnaire",
"builtin": {
"src": "/questionnaires/builtins/initial.qdf",
"element": "qdf:typedef"
},
"committer": "majeed.sahebzadha",
"name": "Test_maj_demo_newG4_2",
"commit message": "added a new module within a module"
}
答案 0 :(得分:8)
我会按如下方式处理:
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
这样,output
字典可以被所有迭代深度访问,并在最后得到return
所有内容。这意味着您不必显式处理递归调用的return
值。
根据您的具体情况,它可能看起来更像:
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
output
可能是另一个容器(例如list
,set
)。
答案 1 :(得分:0)
def recurseDict(dictionary):
if "children" in dictionary:
return recurseDict(dictionary['children'])
else:
return "Whatever you want to return here -- you didn't specify"
这将获取一个字典,检查"children"
是否是其中一个键,然后通过字典dictionary['children']
等进行递归,直到它到达没有{{1}的点。键(例如字典没有其他分支),它进入'children'
分支,你可以返回你想要的任何东西 - 你没有指定。
答案 2 :(得分:-1)
这是一个递归遍历字典的示例方法,假设每个孩子也是字典:
def compute(my_dict):
if 'children' in my_dict:
print my_dict['children']
for child in my_dict['children']:
compute(child)