使用 elementtree 列出比较 “==” 与 “in”

List comparison "==" vs "in" with elementtree

提问人:Avila 提问时间:11/7/2023 最后编辑:mkrieger1Avila 更新时间:11/8/2023 访问量:87

问:

我有一个正在解析的 XML,两个元素具有相同的名称,但需要两个选项中每个选项的唯一值。我能够让代码按照我想要的方式运行,但是我不确定为什么一种方法有效 () 而另一种方法不起作用 ()。in==

XML 代码段:

<metaMetadata>
    <metadataSchema>Value1</metadataSchema>
    <metadataSchema>Value2</metadataSchema>
</metaMetadata>

法典:

schema_val = ['Value1', 'Value2']

for ele in root.findall(".//{*}metaMetadata"):
    m_schema = ele.findall("lom:metadataSchema",ns)

    m_schema_check = [i for i in schema_val if i in m_schema[0].text]
    if m_schema_check:
        for i in m_schema_check:
            schema_val.remove(i)
            if m_schema[1].text in schema_val:
                print('pass')

这符合我的意愿,但我试图理解为什么它只在我拥有 时才有效,而当我拥有代码不起作用并跳过 .in==print

python 元素树

评论

4赞 mkrieger1 11/7/2023
in测试成员资格,测试平等性。它们是不同的,因此只有其中一个有效也就不足为奇了。==
0赞 mkrieger1 11/7/2023
你是说 in 还是 in ?in[i for i in schema_val if i in m_schema[0].text]if m_schema[1].text in schema_val:
0赞 Hermann12 11/8/2023
所需的 xml 输出看起来如何?2 倍值 1?
0赞 Avila 11/8/2023
@mkrieger1 对不起,我应该说得更清楚。我的意思是在声明中if
0赞 Nikolaj Š. 11/8/2023
请编辑问题。“我的意思是在if语句中” — 是一个字符串,是一个字符串列表。为什么他们应该(或者更确切地说可以)是平等的?m_schema[1].textschema_val

答:

0赞 Hermann12 11/8/2023 #1

编辑:是否要将 xml 列表值与架构值列表进行比较?如果列表元素的顺序无关紧要,则可以在比较之前查看列表:sort()

import xml.etree.ElementTree as ET

xml_str = """<metaMetadata>
    <metadataSchema>Value1</metadataSchema>
    <metadataSchema>Value2</metadataSchema>
</metaMetadata>"""

tree = ET.fromstring(xml_str)

l = [c.text for c in tree.findall('.//metadataSchema')]

schema_val = ['Value2', 'Value1']
if l.sort() == schema_val.sort():
    print('true')
else:
    print('false')

输出:true

评论

0赞 Avila 11/8/2023
感谢您的回复:)这有点接近我正在寻找的东西。最大的问题是 和 是必需的,但它们可以出现在任何一个标签中。所以可以先出现。Value1Value2<metadataSchema>Value2
0赞 Hermann12 11/8/2023
@Avila,在比较列表之前,您可以对列表进行排序。我编辑了我的答案。