在xml、Python中用if条件嵌套for循环

2024-04-26 02:52:00 发布

您现在位置:Python中文网/ 问答频道 /正文

当用户输入CHAIN_IDRES_POSITION时,我想返回AA_codeCHAIN_IDCHAIN标记的子元素,RES_POSITIONAA_CODERESIDUE标记的子元素。RESIDUE标记也是CHAIN的子元素 标签。你知道吗

我的代码只返回AA_CODECHAIN_ID = "A"为止 RES_POSITION = "370"。 但是它不会返回其他CHAIN_IDs,而是 它应该会回来。我不明白为什么,任何帮助都可以 感谢你。你知道吗

我在用Elementtree。你知道吗

XML示例:

<RESIDUE>
         <RES_POSITION>370</RES_POSITION>
         <AA_CODE>G</AA_CODE>
      </RESIDUE>
   </CHAIN>
   <CHAIN>
      <CHAIN_ID>B</CHAIN_ID>
      <RESIDUE>
         <RES_POSITION>371</RES_POSITION>
         <AA_CODE>S</AA_CODE>
      </RESIDUE>

My code which returns true result:

   chain = [seq for seq in SEQ.findall('CHAIN') if seq.findtext('CHAIN_ID') == "A"]
    print(chain)
    sequence = [res for res in SEQ.find('CHAIN') if res.findtext('RES_POSITION') == "370"]
    print(sequence)
    for seq in chain:
            for res in sequence:
                if res in seq:
                    print(res.findtext('AA_CODE'))

退货:

[<Element 'CHAIN' at 0x0000019203C83138>]
        [<Element 'RESIDUE' at 0x00000192040E4C78>]
        G

My code for CHAIN_ID as B:

chain = [seq for seq in SEQ.findall('CHAIN') if seq.findtext('CHAIN_ID') == "B"]
print(chain)
sequence = [res for res in SEQ.find('CHAIN') if res.findtext('RES_POSITION') == "371"]
print(sequence)
for seq in chain:
        for res in sequence:
            if res in seq:
                print(res.findtext('AA_CODE'))

退货:

[<Element 'CHAIN' at 0x000002EFB2254DB8>]
[]

Tags: inidchainforifpositioncoderes
1条回答
网友
1楼 · 发布于 2024-04-26 02:52:00
sequence = [res for res in SEQ.find('CHAIN') if res.findtext('RES_POSITION') == "371"]

在这里,您编写SEQ.find(...)而不是SEQ.findall(...)。你知道吗

这是你想要的吗?find()只在XML文件中查找CHAIN的第一个匹配项,我猜,对于找到的元素,行的第二部分(res\u position==371)将计算为False,因此sequence将以空列表结束。你知道吗

另外,虽然findall返回CHAIN元素,但findall只返回CHAIN子元素,这需要调整generator语句的if部分。你知道吗

下面是我实际测试过的一些代码;-):

chain = [seq for seq in SEQ.findall('CHAIN') if seq.findtext('CHAIN_ID') == "B"]
print(chain)
sequence = [res for res in SEQ.findall('CHAIN') if res.findtext('RESIDUE/RES_POSITION') == "371"]
print(sequence)
for seq in chain:
    for res in sequence:
        if res == seq:
            print("=> %s" % res.findtext('RESIDUE/AA_CODE'))
  • 由于序列行现在包含链元素,因此必须通过在剩余元素名称前加前缀来查找RES\u POSITION和AA\u CODE元素。你知道吗
  • 出于同样的原因,您检查res和seq是否相等,而不是“containedness”(这是一个单词吗?)。你知道吗

还有一个建议-试试这个:

chain = [
    seq for seq in SEQ.findall('CHAIN')
    if seq.findtext('CHAIN_ID') == "B"
        and seq.findtext('RESIDUE/RES_POSITION') == "371"
] 
for seq in chain:
    print("=> %s" % seq.findtext('RESIDUE/AA_CODE'))

这样做效率更高,因为它只遍历整个数据一次,不需要嵌套for循环。你知道吗

相关问题 更多 >