2016-11-20 111 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)) –