Pythonic迭代XML元素列表属性的方法?

Pythonic迭代XML元素列表属性的方法?,python,elementtree,Python,Elementtree,我有如下的xml数据: 没有嵌套,我只对那些属性感兴趣name,favoritefood,和favoritesport 我想知道做这件事最像蟒蛇的方式是什么 我的一个想法是 people = ET.parse('file.txt').getroot().findall('person') for person in people: name = person.get('name') favoritefood = person.get('favoritefood') f

我有如下的xml数据:


没有嵌套,我只对那些属性感兴趣
name
favoritefood
,和
favoritesport

我想知道做这件事最像蟒蛇的方式是什么

我的一个想法是

people = ET.parse('file.txt').getroot().findall('person')
for person in people:
    name = person.get('name')
    favoritefood = person.get('favoritefood')
    favoritesport = person.get('favoritesport')
    ...
但是,仅仅为了获取属性,就需要大量不必要的代码行。这似乎是多余的,因为我把所有属性都输入了两次

另一个想法是

people = ET.parse('file.txt').getroot().findall('person')
for name, favoritefood, favoritesport in [(person.get('name'), person.get('favoritefood'), person.get('favoritesport')) for person in people]:
    ...
但是正如你所看到的,这一行非常长,如果我想在列表的末尾标记一个
if
过滤器,它会变得更长


有没有一种更符合python的方法来做到这一点呢?

我没有质疑命名约定,因为这样我的示例可能会产生误导。但这是我的一票

但我的重点是使用上下文管理器加载文件,然后应用方法

with ET.parse('file.txt').getroot().findall('person') as people:
    [...]
现在,我们来看内部方法


第一个版本更长,但对新程序员来说更具可读性。第二种方法使用列表理解,因此更短。我会使用列表理解来选择第二个选项。我会确保线的长度不超过100个字符,并打破它

我没有质疑命名惯例,因为这样我的样本可能会产生误导。但这是我的一票

但我的重点是使用上下文管理器加载文件,然后应用方法

with ET.parse('file.txt').getroot().findall('person') as people:
    [...]
现在,我们来看内部方法


第一个版本更长,但对新程序员来说更具可读性。第二种方法使用列表理解,因此更短。我会使用列表理解来选择第二个选项。我会确保线的长度不超过100个字符,并打破它

您可以创建感兴趣的属性元组,然后在列表理解中进行dict理解。这样你就不会重复你自己,代码也很简短(尽管新手可能更难掌握)


您可以创建感兴趣的属性元组,然后在列表理解中进行dict理解。这样你就不会重复你自己,代码也很简短(尽管新手可能更难掌握)


视情况而定。您实际上打算如何处理这些变量?@DeepSpace在本例中,我试图创建一个dict列表,其中包含这些xml元素的某些属性,这些属性可能会根据特定条件进行更改。这对听写理解来说有点太复杂了。这要看情况而定。您实际上打算如何处理这些变量?@DeepSpace在本例中,我试图创建一个dict列表,其中包含这些xml元素的某些属性,这些属性可能会根据特定条件进行更改。这对于听写理解来说有点太复杂了。你为什么要使用上下文管理器?ElementTree文档没有说您需要关闭该文件。我喜欢python,因为它的设计具有可读性。使用上下文管理器可以提高代码的可读性。所以,我认为这是一个Pythic方法,为什么你使用上下文管理器?ElementTree文档没有说您需要关闭该文件。我喜欢python,因为它的设计具有可读性。使用上下文管理器可以提高代码的可读性。所以我认为它是一种纵横的方法。