Python 编写此elementTree搜索操作的更好方法?

Python 编写此elementTree搜索操作的更好方法?,python,python-2.7,elementtree,Python,Python 2.7,Elementtree,我正在编写一个python脚本来研究期权定价。我用XSL进行了大量的预处理,并输出一个XML文件,该文件使用ElementTreeAPI读入python脚本 xml具有以下结构: 根XML节点的子节点是stock元素,每个stock对应一个元素。 元素的子元素是day元素,每天一个。 元素的子元素是f元素,我向前看的每一天都有一个。 f元素有一些属性,“天”表示一天的前进距离,“变化”表示当天的股价变化 因为股票不是每天都交易,所以“@天”的顺序有缺口。例如,与星期四关联的day元素可能如下所示

我正在编写一个python脚本来研究期权定价。我用XSL进行了大量的预处理,并输出一个XML文件,该文件使用ElementTreeAPI读入python脚本

xml具有以下结构:
根XML节点的子节点是stock元素,每个stock对应一个元素。
元素的子元素是day元素,每天一个。
元素的子元素是f元素,我向前看的每一天都有一个。
f元素有一些属性,“天”表示一天的前进距离,“变化”表示当天的股价变化

因为股票不是每天都交易,所以“@天”的顺序有缺口。例如,与星期四关联的day元素可能如下所示:

<day [info in attributes>
<f days="1" change="-3.1"/>
<f days="4" change="-1"/>
<f days="5" change="0.4"/>
<f days="6" change="1.1"/>
...
</day>

这给出了预期的结果,但我希望有一种更简单的方法来实现这一点,并且希望知道如何更好地处理elementTree对象。

因为X、X-1和X+1的处理是相同的,所以可以使用如下循环:

Changes = []
for day in Test_Stock:
    forward_days = [int(f.get('days')) for f in day]
for x in [X,X-1,X+1]:
    if x in forward_days:
        expiry_day = [f for f in day if int(f.get('days')) == x]
        Changes.append(float(expiry_day[0].get('change')))
        break

不要使用
.get
,而是尝试使用,如果没有匹配的元素而不是异常,则返回
None

使用
find
可以让
ElementTree
为您进行搜索,而无需手动使用
[f for f in int(f.get('days')==x]进行筛选

因此,对于每个
,所需的
f
元素(如果存在)将是此列表中的第一个非
None
项:

[day.find("f[@days='%d']" % index)
 for index in [X, X - 1, X + 1]]

这也意味着您可以将整个函数编写成这样一行可怕的代码(未经测试):

但请不要这样做


当然要查看
。但是要查找

谢谢你的回答,这当然是恰当的,但我正在使用更多的elementTree api寻找一些本质上不同的东西。谢谢,BenC,你帮了我很多,我想你可能意识不到。我知道find()和findall(),但我不使用它们的原因是我认为它们只能解析硬编码字符串(例如,我尝试了find(“f[@day=X]))。我从来都不熟悉%在理解中的用法,这个例子告诉我为什么我真的应该研究它。@DavidR很高兴这有帮助!请注意:find()仍在接收一个字符串参数——只是每次传递的字符串不同而已。这不依赖于列表的理解,也不依赖于%-格式(你可以用+来构建这个字符串参数:
“f[@days=”“+index+”]“
”),但它们都很好地结合在一起。啊,谢谢。我(显然)对python还是比较陌生:)
[day.find("f[@days='%d']" % index)
 for index in [X, X - 1, X + 1]]
Changes = [float(d[0].get('change'))
           for d in [islice(ifilter(len, (day.find("f[@days='%d']" % candidate)
                                          for candidate in [X, X - 1, X + 1])),
                            1)
                     for day in Test_Stock]
           if d]