python - 将字典理解应用于 defaultdict

标签 python dictionary lambda defaultdict dictionary-comprehension

我有以下内容,它将三列表格数据(一个 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,以便进行转换?或者还有哪些其他可行的方法?

最佳答案

您可以使用一个简单的递归函数,将数字与给定值相乘,并为每个 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
    }
}

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

关于python - 将字典理解应用于 defaultdict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37335170/

相关文章:

java - 这是 Function 接口(interface)的正确用法吗?

Pythonunittest检测circleci下运行测试

Python 测试 "framework"用于测试输入文件及其输出

java - 如何从 Python 启动 jBPM 流程?

objective-c - 如何获取在 objective-c 中单击的 UIButtonTypeDetailDisclosure 注释?

c++ - 如何在 C++ 中创建带返回值的内联作用域?

lambda - 提取属性模式,使用 java lambda 合并并构建列表

python - django 查看 session ID - 未登录的用户缺少

python - 将复杂的列(类似字典)转换为多个列

python - 如何在 Python 中添加包含字典值的列