2014-08-28 104 views
0

我想創建一個在Python中的主字典通過拉動值形式3個單獨的字典的過程。 3個字典是這個樣子:通過組合多個其他字典創建一個有組織的字典

X = {'0':[1, 3, 4, 5], '.001':[2, 4, 6, 7]} 
Y = {'0':[5, 6, 9, 2], '.001':[2, 6, 8, 4]} 
Z = {'0':[3, 6, 8, 9], '.001':[3, 1, 5, 8]} 

我希望能夠將這些字典合併成一個單一的主字典,集團從X,Y和Z,從X,Y的第二個值的第一個值,Z等等。最終字典看起來像這樣:

Final = {'0':[1, 5, 3], [3, 6, 6], [4, 9, 8], [5, 2, 9], '.001':[2, 2, 3]..... 

等等。我相信我需要使用for循環,但我不確定。任何幫助是極大的讚賞。

這是我迄今的代碼。所有的單個字典都可以正確創建,但最後一個不會。

Xcoord = {} 
time = [] 
with open ('Nodal_QuardnetsX2.csv', 'r') as f: 
    f.readline() # Skips first line 
    for line in f: 
     values = [s.strip()for s in line.split(',')] 
     Xcoord[values[0]] = map(float, values[1:]) 
     time.append(values[0]) 
     print time 
Ycoord = {} 
with open ('Nodal_QuardnetsY2.csv', 'r') as f: 

    f.readline() # Skips first line 
    for line in f: 
     values = [s.strip()for s in line.split(',')] 
     Ycoord[values[0]] = map(float, values[1:]) 

Zcoord = {} 
with open ('Nodal_QuardnetsZ2.csv', 'r') as f: 
    f.readline() # Skips first line 
    for line in f: 
     values = [s.strip()for s in line.split(',')] 
     Zcoord[values[0]] = map(float, values[1:]) 

counter = 0 
k = len(Xcoord) 
for time in range(k): 
    CoordCombo[time] = Xcoord[counter], Ycoord[counter], Zcoord[counter] 
    counter = counter + 1 
+3

你有任何代碼與我們分享,我們可以幫助你調試嗎? – skrrgwasme 2014-08-28 15:16:28

+0

是Scott我添加了一些代碼。任何幫助都很棒! – 2014-08-28 15:23:13

+0

這可能是你想要的假設關鍵'時間'存在。如果沒有,你必須檢查是否在Ycoord的時間,然後添加。在Xcoord中的時間:CoordCombo [time] = [Xcoord [time],Ycoord [time],Zcoord [time]] – user3885927 2014-08-28 15:37:28

回答

1

@JackRandall,他們語法在最後的字典是不正確的。我建議你閱讀https://docs.python.org/2/tutorial/datastructures.html#dictionaries以瞭解字典。你可能希望你的最終解釋是這樣的,而不是:

Final = {'0':[[1, 5, 3], [3, 6, 6], [4, 9, 8], [5, 2, 9]], '.001':[[2, 2, 3].....]} 

而且要開始,你可以通過在X你的鑰匙環,然後用Y的鍵訪問元素和Z和追加他們都最終的陣列['鍵']。這應該讓你開始,我可以回答更多問題。

這是根據您的意見更新: 如果該鍵不存在X將它插入無

X = {'0':[1, 3, 4, 5], '.001':[2, 4, 6, 7], 'XonlyKey':[1,1,1,1,]} 
Y = {'0':[5, 6, 9, 2], '.001':[2, 6, 8, 4]} 
Z = {'0':[3, 6, 8, 9], '.001':[3, 1, 5, 8]} 
Final={} 
for key, value in X.iteritems(): 
    tempArray=[value] 
    for tempDict in (Y,Z): 
     if key in tempDict: 
      tempArray.append(tempDict[key]) 
     else: 
      tempArray.append(None) 
    Final[key]=tempArray 
0

是爲@ user3885927指出你的語法是錯誤的。

有了結果作爲元組的列表的字典,你可以這樣做:

>>> {key: zip(X[key], Y[key], Z[key]) for key in X.keys()} 
{'0': [(1, 5, 3), (3, 6, 6), (4, 9, 8), (5, 2, 9)], '.001': [(2, 2, 3), (4, 6, 1), (6, 8, 5), (7, 4, 8)]} 

或者以列表的元組的字典:

>>> {key: tuple([[x, y, z] for x, y, z in zip(X[key], Y[key], Z[key])]) for key in X.keys()} 
{'0': ([1, 5, 3], [3, 6, 6], [4, 9, 8], [5, 2, 9]), '.001': ([2, 2, 3], [4, 6, 1], [6, 8, 5], [7, 4, 8])} 
+0

有沒有什麼方法可以在腳本文件中編寫它? – 2014-08-28 16:57:58

+0

您可以在腳本中使用'{key:zip(X [key],Y [key],Z [key])行來編寫X.keys()}'中的鍵,但請注意,使用{}在Python 2.6及更早版本中不起作用。你需要在X.keys()]中鍵入'dict([(key,zip(X [key],Y [key],Z [key]))'' – 2014-08-28 18:00:15

+0

非常感謝 – 2014-08-28 18:07:52

1

這裏有兩個函數來創建一個「主字典「,它只包含所有輸入字典通用的值。您給出的X,Y,Z示例沒有任何三個詞典共有的值,因此您最終會得到一個空字典。

X = {'0':[1, 3, 4, 5], '.001':[2, 4, 6, 7]} 
Y = {'0':[5, 6, 9, 2], '.001':[2, 6, 8, 4]} 
Z = {'0':[3, 6, 8, 9], '.001':[3, 1, 5, 8]} 

dictionaries = [X,Y,Z] 

def compare(d1, d2): 
    d3 = {} 
    for key in d1: 
     for v in d1[key]: 
      if v in d2[key]: 
       if key in d3: 
        d3[key].append(v) 
       else: d3[key] = [v,] 

    return d3 

def createMaster(dictionaries): 
    length = len(dictionaries) 

    if length == 1: 
     return dictionaries[0] 

    d1 = dictionaries.pop() 
    d2 = dictionaries.pop() 
    d3 = compare(d1, d2) 

    if length == 2: 
     return = d3 

    else: 
     dictionaries.append(d3) 
     return createMaster(dictionaries)