【问题标题】:Creating a nested dictionary comprehension in Python 2.7在 Python 2.7 中创建嵌套字典理解
【发布时间】:2012-02-11 09:26:28
【问题描述】:

我有一个从 MySQL cursor.fetchall() 返回的嵌套元组,其中包含 (datetime.date, float) 形式的一些结果。我需要将它们分成 [month/year][day of month] 形式的嵌套字典 - 所以我想要一个字典(比如说)我会参考的读数,例如 readings['12/2011'][13] 获取'12/2011' 月第 13 天的读数。这是为了生成图表,显示叠加的多个月的每日读数。

我的困难在于(我相信)我需要使用唯一的月/年标识符来设置字典的第一个维度。我目前正在通过以下方式获取这些列表:

list(set(["%02d/%04d" % (z[0].month, z[0].year) for z in raw]))

其中 raw 是从数据库返回的元组列表。

现在我可以很容易地通过两个阶段的过程来执行此操作 - 设置字典的第一维,然后再次检查数据以设置第二维。我想知道是否有一种可读的方法可以使用嵌套的字典/列表推导式同时执行这两个步骤。

如果有任何建议,我将不胜感激。谢谢。

【问题讨论】:

  • 您不需要在某个阶段对月份进行排序吗?有什么好的理由说明您没有按自然顺序排列的月份键,例如'2011-12' 即使您不打算对它们进行排序?
  • 不错的技巧。谢谢你。它们采用“mm/yyyy”格式,因为这些是用于图表上不同轨迹的系列标签,并且“12/2011”比 ISO 格式的日期更具可读性(当然对于英国观众而言)。但这是一个很好的观点。

标签: python dictionary python-2.7 nested-loops


【解决方案1】:

在简洁的oneliner中似乎很难同时完成这两个级别,我建议您改为使用defaultdict,如下所示:

res = defaultdict(dict)
for z in raw:
    res["%02d/%04d"%(z[0].month, z[0].year)][z[0].day] = z

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 2011-06-06
    • 2023-01-18
    • 1970-01-01
    • 2016-06-09
    • 2016-11-25
    • 1970-01-01
    相关资源
    最近更新 更多