簡體   English   中英

通過鍵和值組合多個詞典?

[英]Combine multiple dictionaries by keys and values?

經過幾個小時和其他職位的建議,我無法解決我的問題。 我必須管理許多詞典(直到我知道工作的唯一途徑)。

對於我要組合的所有四個字典,其中三個具有相同的鍵(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的信息創建一個字典d1, d2然后將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行。

由於缺乏深入的知識,對於簡單的建議(對於假人)將不勝感激。

我認為這是您正在尋找的東西,盡管尚不清楚為何排除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。 您能否提供一些有關為什么所需輸出看起來像這樣的背景? 無論如何,這應該可以幫助您入門。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM