私はdefaultdict
に3つの表のデータ(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に分解することはできますか?あるいは、他にどんなアプローチが可能ですか?
出力ルックス入力としてdefaultdict
と乗算器
2
あなたの例を考えると
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
は以下:あなたが指定された値で、すべてのdict
インスタンスの数値を乗算し、単純な再帰関数を使用することができます
この関数を呼び出すことを忘れました。 –
'.items()'が必要なので、実際にエントリを処理しています。 –
すぐに発見される2つのバグを考慮して、 'campaigns_and_adsets_and_pageviews_from_ga'関数をネストされた辞書を定義する辞書リテラル(まだ' defaultdict'は気にしないでください)を返すようにすることをお勧めします: 'return {u'XXX 20160314 ' {u'Carnival desktopfeed ':2.0、...}} '。次に、それを正しくコピーして数字を2倍にするコードを書いてください。次に、計算された結果で 'defaultdict'を返します。そうすれば、間違っているものはすべて 'defaultdict'とする必要があると仮定することで注意をそらすことはありません:-) –