2016-11-20 9 views
0

時間があり、他の投稿からの提案を受けて、私は自分の問題を解決できませんでした。 私は多くの辞書を管理しなければなりません(今まで私が働くことを知っている唯一の方法です)。複数の辞書をキーと値で組み合わせる?

私が結合したいすべての辞書について、そのうち3つは同じ鍵(d1、d2およびd3)を持っています。

d1 = {key1: [x1, x2, x3], key2: [y1, y2, y3], key3: [z1, z2, z3]} 
d2 = {key1: [x4, x5, x6],key2: [y4, y5, y6], key3: [z4, z5, z6]} 
d3 = {key1: [x7, x8, x9], key2: [y7, y8, y9], key3: [z7, z8, z9]} 
d4 = {x2: [a, b, c], y2: [d, e, f], z2: [g, h, i]} 

第四辞書には、メタデータを含む参照ファイルによって生成された辞書で、そのキーがd1内の1つの値に等しいと私がしたいことはd1, d2d3からの情報で辞書を作成することで、後には、最終的な辞書にはd4の情報があります。

final_dict = {key1: [x1, a, b, x2, x3, x4, x5, x8, x9], 
       key2: [y1, d, e, y2, y3, y4, y5, y8, y9], 
       key3: [z1, g, h, z2, z3, z4, z5, z8, z9]} 

と表形式で次のように印刷:現時点では

key1 x1 a b x2 x3 x4 x5 x8 x9 
key2 y1 d e y2 y3 y4 y5 y8 y9 
key3 z1 g h z2 z3 z4 z5 z8 z9 

私は汚いスクリプトが、「作品」を持っています。

#!/usr/bin/env python 

with open("file1.txt", "r") as file1, open("file2.txt", "r") as file2,/
    open("file3.txt", "r") as file3, open("file4.txt", "r") as file4: 

    d1 = {} 
    d2 = {} 
    d3 = {} 
    d4 = {} 
    dicts = [d1, d2, d3, d4] 

    #d1 = {key1: [x1, x2, x3], key2: [y1, y2, y3], key3: [z1, z2, z3]} 
    #d2 = {key1: [x4, x5, x6],key2: [y4, y5, y6], key3: [z4, z5, z6]} 
    #d3 = {key1: [x7, x8, x9], key2: [y7, y8, y9], key3: [z7, z8, z9]} 
    #d4 = {x2: [a, b, c], y2: [d, e, f], z2: [g, h, i]} 

    for b in file1: 
     row = b.strip().split('\t') 
     if row[0] not in d1: 
      d1[row[0]] = row[1], row[3], row[4] 

    for c in file2: 
     row = c.strip().split('\t') 
     if row[0] not in d2: 
      d2[row[0]] = row[1:] 

    for f in file3: 
     row = f.strip().split('\t') 
     if row[0] not in d3: 
      d3[row[0]] = row[1:] 

    for m in file4: 
     row = m.strip().split('\t') 
     if row[0] not in d4: 
      d4[row[0]] = row[1], row[3], row[2] 

    final_dict = {} 
    for k in (dicts): 
     for key, value in k.iteritems(): 
      final_dict[key].append(value) 

    print final_dic 

    #key1 x1 a b x2 x3 x4 x5 x8 x9 
    #key2 y1 d e y2 y3 y4 y5 y8 y9 
    #key3 z1 g h z2 z3 z4 z5 z8 z9 

問題は最後の3行です。

深い知識がないため、簡単な提案(ダミーの場合)が評価されます。

+0

だから、基本的に 'd1'、' d2'、および 'd3'をキーにマージしたいのですか? 'x6'、' x7'、 'y6'、' y7'、 'z6'、' z7'はどうなりますか?私はなぜ彼らがあなたの希望する出力に含まれていないのかの背後にある論理を取得しません。 – blacksite

+0

ディクショナリを別の質問に分けて分けることをお勧めします。そして、これを多くの辞書から1つに移動する方法に集中させてください。 – Karnage

+0

この場合、* d3 *からのすべての情報が必要なわけではありません。それが彼らが最終的な出力に現れない理由です。 アドバイスをいただきありがとうございます@ Karnage。 –

答えて

1

などx6x7y6y7、のような変数を除外した理由として、ロジックがまだ不明であるが、私は、これはあなたが探しているものだと思う:

まず、これらの変数(例えばを作りますさんがあなたの辞書をインスタンス化させ、

values = [letter + str(number) for letter in 'xyz' for number in range(1, 10)] + ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'] 
for v in values: 
    exec('%s = "%s"' % (v, v)) 

次:

x2など)が存在し、後で結果を簡単に追跡のためにそれらの値を文字列として自分の名前を割り当てます

new_dict = {} 
for d in [d1, d2, d3]: 
    for key in d: 
     if key not in new_dict: 
      # if key not yet in the dict, make it so 
      new_dict[key] = d[key] 
     else: 
      # if key already there, then we'll just add the lists together 
      new_dict[key] += d[key] 

そして、最後に、d4から最初の二つの個々の文字を取得するために、我々はこれを試すことができます:3210

d1 = {key1: [x1, x2, x3], key2: [y1, y2, y3], key3: [z1, z2, z3]} 
d2 = {key1: [x4, x5, x6],key2: [y4, y5, y6], key3: [z4, z5, z6]} 
d3 = {key1: [x7, x8, x9], key2: [y7, y8, y9], key3: [z7, z8, z9]} 
d4 = {x2: [a, b, c], y2: [d, e, f], z2: [g, h, i]} 

それでは、dict決勝、大きな、一つに辞書をマージしてみましょう

for key in new_dict: 
    for other_key in d4: 
     if other_key in new_dict[key]: 
      new_dict[key] += d4[other_key][:2] 

出力を確認します。

>>> new_dict 
{'key2': ['y1', 'y2', 'y3', 'y4', 'y5', 'y6', 'y7', 'y8', 'y9', 'd', 'e'], 'key3': ['z1', 'z2', 'z3', 'z4', 'z5', 'z6', 'z7', 'z8', 'z9', 'g', 'h'], 'key1': ['x1', 'x2', 'x3', 'x4', 'x5', 'x6', 'x7', 'x8', 'x9', 'a', 'b']} 

これは基本的にあなたの望む結果ですが、6と7が含まれています。あなたが望む出力がそのように見える理由について、いくつかの背景を提供できますか?とにかく、これはあなたを開始する必要があります。

+0

こんにちは@not_a_robot。 d4の文字列の値を他の定義された値の直後に含めて定義しました dicts = [d1、d2、d3、d4] values = [xyz]の文字の場合は[letter + str(number) (1,10)] + ['a'、 'b'、 'c'、 'd'、 'e'、 'f'、 'g'、 'h'、 'i'] v値の場合は : exec( '%s = "%s"%(v、v)) –

関連する問題