2016-11-20 7 views
0

시간이 지나고 다른 게시물에서 제안을 받으면 문제를 해결할 수 없었습니다. 많은 사전을 관리해야합니다 (지금까지 내가 일하는 유일한 방법).키와 값으로 여러 사전을 결합 하시겠습니까?

내가 결합하고자하는 4 개의 사전 모두에 대해 세 개의 동일한 키 (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

나는 이것이 당신이 비록 논리로 왜 변수 x6x7y6는, y7 등은 제외 하였다는 아직 불분명처럼 찾고있는 무슨 생각 x1, x2는 등)이 존재하고, 나중에 결과를 쉽게 추적을 위해 자신의 값을 문자열로 자신의 이름을 지정 :

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에 사전을 병합하자 : 마지막으로, d4에서 처음 두 개의 개별 문자를 얻기 위해,

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] 

, 우리는이를 시도 할 수 있습니다 :

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 (숫자) (1, 10)] + [ 'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i'] v 값의 경우 : exec ('% s = "% s"% (v, v)) –