2016-11-20 170 views
0

工作時間和其他帖子的建議後,我無法解決我的問題。 我必須管理許多字典(直到現在我知道工作的唯一方式)。按鍵和值組合多個字典?

對於我想合併的所有四本字典,它們中的三個具有相同的鍵(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等於一個值和我想是創建具有從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

我會建議分開你如何把字典變成另一個問題。只要讓這個專注於如何從衆多詞典合而爲一。 – Karnage

+0

在這種情況下,我不希望來自* d3 *的所有信息。這就是他們沒有出現在最終輸出中的原因。 感謝您的建議@Karnage。 –

回答

1

我覺得這是你要找的東西,雖然邏輯,爲什麼變量像x6x7y6y7等被排除在外是目前還不清楚:

首先,這些變量(例如x1x2等)的存在,並指定自己的名字作爲字符串,其值後的結果更容易追蹤:

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)) 

接下來,讓我們來實例化你的字典:

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

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獲得前兩個單個字母,我們可以試試這個:

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' (1,10)] + ['a','b','c','d','e','f','g','h','i'] exec('%s =「%s」'%(v,v)) –