从嵌套字典中生成列表的Python风格方法

3
在Python 2.7中工作时,我有一个带有一些报价数据的嵌套字典,我希望从中生成一个成功构建的报价列表。目前,我是这样做的:
result = []
for nameStr, nameData in dataTbl.iteritems():
    for valueDate, record in nameData.iteritems():
        quote = histRecordToQuote(securitiesDict = securitiesDict,
                                  nameStr        = nameStr,
                                  valueDate      = valueDate,
                                  record         = record)
        if quote:
            result.append(quote)

有没有更Python化的方式来做这个?我有一种预感,我们可以用列表推导式来更快地或者更清晰地完成它。当由于数据错误无法构建报价时,函数histRecordToQuote()将返回None。你可以建议不同的签名,我将很高兴为了更清晰/更快的代码进行重写。
非常感谢。
编辑
一个字典结构的示例:
{'IBM':  {'20140215':2.53, '20140216':2.55},
 'MSFT': {'20140213':2.45, '20140216':0.},
 'AMZN': {'20140212':0., '20140214':2.59}}

参数securitiesDict是外部的,它用于构造histRecordToQuote()内部的Quote类。

histRecordToQuote()的输出将对0价格记录返回None,并从其余记录中构造有效的Quote

Quote('IBM', '20140215', 2.53)
Quote('IBM', '20140216', 2.55)
Quote('MSFT', '20140213', 2.45)
None
Quote('AMZN', '20140214', 2.59)
None

我的最终输出需要是有效报价的列表:

[Quote('IBM', '20140215', 2.53),
Quote('IBM', '20140216', 2.55),
Quote('MSFT', '20140213', 2.45),
Quote('AMZN', '20140214', 2.59)]

1
你能提供一个字典结构的清晰例子吗? - Totem
1
和期望的输出是什么? - J David Smith
@Totem,请查看更新。 - gt6989b
@JDavidSmith 我已经放入了预期的函数输出和最终输出中我想要的内容。谢谢。 - gt6989b
1个回答

2

您可以使用嵌套推导式来实现相同的效果:

[ quote for quote in
    (histRecordToQuote(securitiesDict = securitiesDict,
                       nameStr        = nameStr,
                       valueDate      = valueDate,
                       record         = record)
      for nameStr, nameData in dataTbl.iteritems()
        for valueDate, record in nameData.iteritems())
    if quote ]

这会更快吗? - gt6989b
2
列表推导式比累加器略快,但不要期望有惊人的差异。进行性能分析并尝试! - Adam Smith
1
这里不应该是速度的动力(那样可能会令人沮丧)。使用推导式会将你束缚在一个紧身胸衣中,从而防止许多其他可能出现的错误。Pythonic的方式除了速度之外还具有实际优势。 - Alfe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接