【问题标题】:Applying dictionary comprehension to a defaultdict将字典理解应用于 defaultdict
【发布时间】:2016-09-17 00:56:15
【问题描述】:

我有以下内容,它将三列表格数据(openpyxl 工作表)解析为defaultdict

def campaigns_and_adsets_and_pageviews_from_ga(ourTab):
    d = defaultdict(lambda: defaultdict(int))
    for row in ourTab.rows[1:-1]:
        if ('Facebook' in row[0].value) and ('(not set)' not in row[2].value):
            d[row[1].value][row[2].value] += row[4].value
    return d

其输出如下所示:

In [790]: campaigns_and_adsets_and_pageviews_from_ga(ourTab)
Out[790]: 
defaultdict(<function __main__.<lambda>>,
            {u'XXX 20160314': defaultdict(int,
                         {u'Carnival desktopfeed': 2.0,
                          u'Carnival mobilefeed': 588.0,
                          u'PYS Broad desktopfeed': 371.0,
                          u'PYS Broad mobilefeed': 1192.0}),
             u'YYY Intl 20150903': defaultdict(int,
                         {u'CA desktopfeed': 2.0}),

我想要做的是将每个元素中的最终值(即 2.0、588.0 等)乘以一个常数,从而得到另一个 defaultdict(甚至常规嵌套的 dict 也可以)。

可以以某种方式将 defaultdict 解构为嵌套 dict 以使转换成为可能吗?或者还有什么其他可能的方法?

【问题讨论】:

  • 你忘记调用函数了。
  • 您需要.items(),这样您实际上是在处理条目。
  • 鉴于立即发现了两个错误,我建议您首先 bodge/mock 您的 campaigns_and_adsets_and_pageviews_from_ga 函数以仅返回定义嵌套字典的字典文字(不要介意 defaultdict):@987654329 @。然后编写正确复制它并将数字加倍的代码。然后切换回返回带有计算结果的defaultdict。这样你就不会因为假设所有问题都与defaultdict有关而分心:-)
  • @SteveJessop 中肯,做得好。

标签: python dictionary lambda defaultdict dictionary-comprehension


【解决方案1】:

您可以使用一个简单的递归函数,将数字与给定值相乘,并为每个 dict 实例构造一个新字典:

from numbers import Number

def multiply(o, mul):
    if isinstance(o, dict):
        return {k: multiply(v, mul) for k, v in o.items()}
    elif isinstance(o, Number):
        return o * mul
    else:
        return o

鉴于您的示例 defaultdict 和乘数 2 作为输入,输出如下所示:

{
    u'YYY Intl 20150903': {u'CA desktopfeed': 4.0}, 
    u'XXX 20160314': {
        u'Carnival desktopfeed': 4.0, 
        u'PYS Broad desktopfeed': 742.0, 
        u'PYS Broad mobilefeed': 2384.0, 
        u'Carnival mobilefeed': 1176.0
    }
}

请注意,该示例不适用于列表,因为您需要添加更多代码。

【讨论】:

  • 现在那就是跳出框框思考。不知道numbers 模块。谢谢你们。
  • @Pyderman:在我发现需要一种比分别处理 floatint 更简单的方法之后,我也不得不搜索它。
猜你喜欢
  • 2018-07-28
  • 2014-06-18
  • 1970-01-01
  • 2019-07-29
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多