2016-08-10 8 views
0

私はいくつかの辞書場合は保存されたレコードのコレクションを持っている:試合値

d1 = {'id':['223','444'],'value_1':['v1','x1']} 
d2 = {'id': ['223','666'],'value_2':['v2','x2']} 
d3 = {'id':['223','444'], 'value_3':['v3','x3']} 

私は最初の辞書のIDと一致するすべてのレコードを検索し、すべてと新しいものにそれらを保存したいですフィールド、「_1」、「_2」と「VALUE_3」:

d_4 = {'id':[],'value_1':[],'value_2':[],'value_3':[]} 

レコードの1つは、私が追加されます「----」はフィールド内のすべての辞書に存在しない場合。だから、出力は、この場合には、次のようになります。

d_4 

{'id': ['223', '444'], 
'value_1': ['v1', 'x1'], 
'value_2': ['v2', '----'], 
'value_3': ['x3', 'x3']} 

私はそうするように、このコードを書いた:

for i,id_d1 in enumerate(d1['id']): 
    d_4['id'].append(id_d1) 
    d_4['value_1'].append(d1['value_1'][i]) 
    if id_d1 in d2['id']: 
     for j,id_d2 in enumerate(d2['id']): 
      if id_d1==id_d2: 
       d_4['value_2'].append(d2['value_2'][j]) 
    else: 
     d_4['value_2'].append('----') 
    if id_d1 in d3['id']: 

     for k,id_d3 in enumerate(d3['id']): 
      if id_d1==id_d3: 
       d_4['value_3'].append(d3['value_3'][j]) 
    else: 
     d_4['value_3'].append('----') 

しかし、良いアプローチのように思えるしません。

+1

この権利を理解しましたか? rレコードは、実際にはIDの**リストである 'id'メンバーと、実際には値のリストである' value_x'メンバーを持ち、各値はidに対応していますか?つまり、 'd1 ['value_1'] [0]'は 'd1 ['id'] [0]'に対応する値ですか? –

+0

これは、レコード "*がすべての辞書に存在しない場合、そのフィールドに '----'を追加すると言うので、' d1' idsが参照かどうかはわかりません。 'd3 = {'id':['223'、 '555']、 'value_3':['v3'、 'x3']}' '---- '' 'd_4'では' value_3'、 'value_1'でも'? – zezollo

+0

@マシューブリッドはい、それは正しいです –

答えて

1

多分これがお手伝いします:

コード:

import sys 
print(sys.version) 

# you should use an iterable for your data 
in_list = [{'id':['223','444'],'value_1':['v1','x1']}, 
    {'id': ['223','666'],'value_2':['v2','x2']}, 
    {'id':['223','444'], 'value_3':['v3','x3']} 
    ] 

print "Input:\n", in_list 

# note that dictionaries are not ordered 
out_dict = {} 
out_dict["id"] = in_list[0]["id"] 
out_dict["value_1"] = in_list[0]["value_1"] 

for i,d in enumerate(in_list[1:]): 
    values = [v[1] for v in d.items() if "value" in v[0]][0] 
    #print(i, d, values) 
    if in_list[i+1]["id"] != in_list[0]["id"]: 
     values[1] = "---" 
    out_dict["value_{}".format(i+2)] = values 

print "Output:\n", out_dict 

アウト:

2.7.2 (default, Aug 31 2011, 14:05:14) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build)] 
Input: 
[{'value_1': ['v1', 'x1'], 'id': ['223', '444']}, {'id': ['223', '666'], 'value_2': ['v2', 'x2']}, {'id': ['223', '444'], 'value_3': ['v3', 'x3']}] 
Output: 
{'value_1': ['v1', 'x1'], 'id': ['223', '444'], 'value_3': ['v3', 'x3'], 'value_2': ['v2', '---']} 


更新:必要な出力 アップデート2を取得するために、エラーを修正した:i + 1は

をオフセット
+0

変数を反復処理する必要がある場合:>>> d1 = {"key":なし} >>> i = 1 >>> print(locals )["d" + str(i)] ["key"]) None' – handle