遍历XML元素列表的属性的Pythonic方法?

时间:2018-09-20 14:38:20

标签: python elementtree

我有如下所示的xml数据:

<person name="kyle" favoritefood="ham" favoritesport="baseball" />
<person name="sarah" favoritefood="chicken" favoritesport="basketball" />
<person name="susan" favoritefood="tuna" favoritesport="soccer" />

没有嵌套,我只对namefavoritefoodfavoritesport这些属性感兴趣。

我想知道最Python化的方式是什么。

我的一个主意是

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过滤器,则该行会变得更长。

还有更多的pythonic方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:1)

我没有挑战命名约定,因为我的示例可能会引起误解。但这是我的投票

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

with ET.parse('file.txt').getroot().findall('person') as people:
    [...]

现在,我们转到内部方法。

第一个版本较长,但对新程序员更易读。第二个使用列表理解,因此更短。我将使用列表理解来进行第二种选择。我将确保行长不超过100个字符并中断它。

答案 1 :(得分:1)

您可以创建一个您感兴趣的属性的元组,然后在列表推导中进行字典推导。这样,您就不必重复自己了,代码简短明了(尽管对于新手来说可能更难掌握)。

required_attributes = ('name', 'favoritefood', 'favoritesport')
list_of_people = [{attribute: person.get(attribute) for attribute in required_attributes} 
                  for person in persons]

print(list_of_people)
# [{'name': 'kyle', 'favoritefood': 'ham', 'favoritesport': 'baseball'},
#  {'name': 'sarah', 'favoritefood': 'chicken', 'favoritesport': 'basketball'}, 
#  {'name': 'susan', 'favoritefood': 'tuna', 'favoritesport': 'soccer'}]