【问题标题】:Pythonic way to produce a list from nested dictionary从嵌套字典生成列表的 Pythonic 方法
【发布时间】:2014-03-28 13:21:34
【问题描述】:

在 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)

有没有更 Pythonic 的方式来做到这一点?我有一种预感,我们可以通过列表理解做得更快或更清晰。函数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)]

【问题讨论】:

  • 你能提供一个清晰的dict结构例子吗?
  • 和想要的输出?
  • @Totem 请看更新
  • @JDavidSmith 我输入了预期的函数输出以及我想要的最终输出。谢谢。

标签: python python-2.7 dictionary iteration list-comprehension


【解决方案1】:

您可以通过嵌套推导实现同样的目的:

[ 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 ]

【讨论】:

  • 这会更快吗?
  • List comps 比累加器快一些,但不要指望有明显的差异。分析它并尝试!
  • 这里的动机不应该是速度(那时可能会令人沮丧)。使用推导式将您束缚在紧身胸衣中,从而防止了许多否则可能出现的错误。 Pythonic 方式除了速度之外还有实际优势。
猜你喜欢
  • 2020-10-19
  • 1970-01-01
  • 2019-05-09
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2018-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多