将字典理解应用于 defaultdict
Applying dictionary comprehension to a defaultdict
我有以下内容,它将三列表格数据(一个 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
}
}
请注意,该示例不适用于列表,对于那些您需要添加更多代码。
我有以下内容,它将三列表格数据(一个 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
}
}
请注意,该示例不适用于列表,对于那些您需要添加更多代码。