1

私は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インスタンスの数値を乗算し、単純な再帰関数を使用することができます

+4

この関数を呼び出すことを忘れました。 –

+4

'.items()'が必要なので、実際にエントリを処理しています。 –

+2

すぐに発見される2つのバグを考慮して、 'campaigns_and_adsets_and_pageviews_from_ga'関数をネストされた辞書を定義する辞書リテラル(まだ' defaultdict'は気にしないでください)を返すようにすることをお勧めします: 'return {u'XXX 20160314 ' {u'Carnival desktopfeed ':2.0、...}} '。次に、それを正しくコピーして数字を2倍にするコードを書いてください。次に、計算された結果で 'defaultdict'を返します。そうすれば、間違っているものはすべて 'defaultdict'とする必要があると仮定することで注意をそらすことはありません:-) –

答えて

3

は新しい辞書を構築

{ 
    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 
    } 
} 

さらにコードを追加する必要がある場合は、この例はリストでは機能しません。

+1

今は*箱の外で考えている。 'numbers'モジュールを認識していませんでした。両方の面で感謝します。 – Pyderman

+0

@Pyderman: 'float'と' int'を別々に扱うよりも簡単な方法が必要だと思ったあと、それを検索しなければなりませんでした。 – niemmi

関連する問題