Python字典遍历问题:修改函数以生成所有键对应的完整Groups XML结构
问题:遍历字典生成完整的Groups XML结构
你现在遇到的情况是:明明想让函数遍历字典里的所有键来生成完整的XML组结构,但执行后只输出了第一个键对应的内容。别急,咱们一步步来解决这个问题。
原问题场景
你的字典定义:
PathNameRxn = {'ID':'2048 444','Name':'john hh', 'Father Name':'David ll'}
原DefGrp函数:
def DefGrp(PathNameRxn): #.split("_")[0] groups="" # RxnID = Rxn.ID #print(PathName) for PathName in PathNameRxn: group= ''' <groups:group sboTerm="SBO:0000633" groups:id="group" groups:name="'''+PathName+'''" groups:kind="partonomy"> <groups:listOfMembers> ''' for RxnID in PathNameRxn[PathName].split(): idRef = ''' <groups:member groups:idRef="'''+str(RxnID.split("_")[0])+'''"/> ''' groups += idRef listOfMembers= ''' </groups:listOfMembers> </groups:group>''' return group+groups+listOfMembers
执行listOfGroups=DefGrp(PathNameRxn)后,只得到ID对应的XML块,但你期望生成所有键对应的完整结构。
问题根源
核心问题太明显了——原函数在第一次循环里就直接执行了return语句!这会导致函数立刻终止,根本没机会处理字典里的Name和Father Name这两个键,自然只能输出第一个键的内容。
修改后的代码
咱们把return移到循环外面,让函数遍历完所有字典键后,再返回拼接好的完整XML内容。同时为了代码更清晰,我把每个组的头部、成员、尾部分开处理:
def DefGrp(PathNameRxn): full_groups = "" # 用来存储所有组的完整XML内容 for key in PathNameRxn: # 生成当前组的头部 group_head = '''<groups:group sboTerm="SBO:0000633" groups:id="group" groups:name="'''+key+'''" groups:kind="partonomy"> <groups:listOfMembers> ''' # 生成当前组的成员列表 member_blocks = "" for item in PathNameRxn[key].split(): member_blocks += ''' <groups:member groups:idRef="'''+str(item.split("_")[0])+'''"/> ''' # 生成当前组的尾部,并拼接到总内容里 group_tail = ''' </groups:listOfMembers> </groups:group> ''' full_groups += group_head + member_blocks + group_tail # 遍历完所有键后,返回完整的XML结构 return full_groups
效果验证
现在执行修改后的函数,你会得到完全符合预期的完整XML:
<groups:group sboTerm="SBO:0000633" groups:id="group" groups:name="ID" groups:kind="partonomy"> <groups:listOfMembers> <groups:member groups:idRef="2048"/> <groups:member groups:idRef="444"/> </groups:listOfMembers> </groups:group> <groups:group sboTerm="SBO:0000633" groups:id="group" groups:name="Name" groups:kind="partonomy"> <groups:listOfMembers> <groups:member groups:idRef="john"/> <groups:member groups:idRef="hh"/> </groups:listOfMembers> </groups:group> <groups:group sboTerm="SBO:0000633" groups:id="group" groups:name="Father Name" groups:kind="partonomy"> <groups:listOfMembers> <groups:member groups:idRef="David"/> <groups:member groups:idRef="ll"/> </groups:listOfMembers> </groups:group>
内容的提问来源于stack exchange,提问作者Helena
相关产品推荐
相关产品推荐

