将字典理解应用于defaultdict

时间:2016-05-19 22:39:01

标签: python dictionary lambda defaultdict dictionary-comprehension

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

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

我想要做的是将每个元素中的最终值(即2.0,588.0等)乘以常量,从而得到另一个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}), (或者甚至是常规嵌套defaultdict就可以了)。

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

1 个答案:

答案 0 :(得分:3)

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

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