我有如下所示的xml数据:
<person name="kyle" favoritefood="ham" favoritesport="baseball" />
<person name="sarah" favoritefood="chicken" favoritesport="basketball" />
<person name="susan" favoritefood="tuna" favoritesport="soccer" />
没有嵌套,我只对name
,favoritefood
和favoritesport
这些属性感兴趣。
我想知道最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方法可以做到这一点吗?
答案 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'}]