2017-03-11 20 views
1

私が渡したデータを複製し、私のように置くアウトを取得:Pythonのデフォルトの辞書はpythonでデフォルト辞書のキー

defaultdict(<type 'list'>, {'[0, 13, 26, 39]': ['1']})       
defaultdict(<type 'list'>, {'[0, 13, 26, 39]': ['1']}) 
defaultdict(<type 'list'>, {'[6, 19, 32, 45]': ['1']}) 
defaultdict(<type 'list'>, {'[3, 16, 29, 42]': ['1']}) 

どのようにそれは上記の出力に重複するキーを取得することは可能でしょうか?

は、それは私が実行しているコードは

def make_bands(value): 
    d2 = defaultdict(list) 
    for key, val in value.iteritems(): 
     d2[(str(list(val[0:4])))].append("1") 

    print d2 

が別の辞書である

defaultdict(<type 'list'>, {'[0, 13, 26, 39]': ['1', '1']})       
defaultdict(<type 'list'>, {'[6, 19, 32, 45]': ['1']}) 
defaultdict(<type 'list'>, {'[3, 16, 29, 42]': ['1']}) 

ようにすべきではない

機能 make_bandsは、次のようにスパークRDDを処理するために呼び出されます

以下:

signatureBands = signatureTable.map(lambda x: make_bands(x)).collect() 
+0

あなたが使用しているのpythonのフルバージョンは何ですか? –

+0

私はこの問題のない辞書を作ることができるようです。このエラーを小さな例で再現できますか?これは私が試したことです: '' d = defaultdict(list) '' orson ''のxには[[d [str(list)([x、 "en"]))] append( "1")を付け加えよう。 – putonspectacles

+4

明らかにあなたが投稿したコードから出力されたものではありません - 4つの '' defaultdict''が表示されています。コードは1つだけを出力します。おそらくそれはコードの4つの別々の呼び出しから来ました。 – jasonharper

答えて

2

まず、いいえ、あなたが望むように出力を期待することはできません。 d2はコール間で保持されません。これは、関数を入力するたびに新たに作成されます。状態を保持するクラス、ジェネレータ(ここではあまりエレガントではありません)、ラムダの代わりに関数を構築する関数(ここで私が選択します):

def build_make_bands(): 
    d2 = defaultdict(list) 
    def make_bands(value): 
     for key, val in value.iteritems(): 
      d2[(str(list(val[0:4])))].append("1") 
     print d2 
    return make_bands 
そして、あなたはこのようにそれを呼びたい:

signatureTable.map(build_make_bands()).collect() 
+0

make_bandsは一度だけ呼び出されています。もう一度呼び出すと新しいデフォルトディクショナリを作成する必要があります –

+0

コードから得られる出力は ですdefaultdict(、{'[0,13,26,39]':[1]}) defaultdict(、 defaultdict(、{'[6,19,32,45]':[2]、 '[0,13,26,39]':[1]}) '' [0、13]、[2]、[3,16,29,42]:[3]、 '[0,13,26,39]':[1]}) defaultdict(、{'[0、13 、26、39] ':[4]}) –

+2

あなたの質問のコードがあなたが持っているコードと正確に一致するなら、 'make_bands'が4回呼び出されます。 'print'文がループの外側にあります。したがって、 'make_bands'の呼び出しごとに1回だけ呼び出されます。また、追加のキーがありません。それは、関数呼び出しの終わりにちょうど1つのキーを持っています。重複しないキーを削除する方法はありません。結論として唯一のことは 'make_bands'がRDDの各値(' row'の上)で一度呼び出されるということです。 –