2013-11-26 39 views
1

列表理解是一個偉大的結構,用於以列表的形式進行概括,以便可以優雅地管理列表的創建。是否有類似的工具來管理Python中的字典?優雅地概括分類爲Python中的字典?

我有以下功能:

# takes in 3 lists of lists and a column specification by which to group 
def custom_groupby(atts, zmat, zmat2, col): 
    result = dict() 
    for i in range(0, len(atts)): 
     val = atts[i][col] 
     row = (atts[i], zmat[i], zmat2[i]) 
     try: 
      result[val].append(row) 
     except KeyError: 
      result[val] = list() 
      result[val].append(row) 
    return result 

    # organises samples into dictionaries using the groupby 
def organise_samples(attributes, z_matrix, original_z_matrix): 
    strucdict = custom_groupby(attributes, z_matrix, original_z_matrix, 'SecStruc') 

    strucfrontdict = dict() 
    for k, v in strucdict.iteritems(): 
     strucfrontdict[k] = custom_groupby([x[0] for x in strucdict[k]],            
           [x[1] for x in strucdict[k]], [x[2] for x in strucdict[k]], 'Front') 

    samples = dict() 
    for k in strucfrontdict: 
     samples[k] = dict() 
     for k2 in strucfrontdict[k]: 
      samples[k][k2] = dict() 
      samples[k][k2] = custom_groupby([x[0] for x in strucfrontdict[k][k2]], 
        [x[1] for x in strucfrontdict[k][k2]], [x[2] for x in strucfrontdict[k][k2]], 'Back') 
    return samples 

看起來這是笨重。在Python中幾乎所有的東西都有優雅的方式,我傾向於認爲我錯誤地使用了Python。

更重要的是,我希望能夠更好地概括這個函數,以便我可以指定字典中應該有多少「圖層」(不使用多個lambda表達式並以Lisp樣式接近問題)。我想要一個函數:

# organises samples into a dictionary by specified columns 
# number of layers could also be assumed by number of criterion 
def organise_samples(number_layers, list_of_strings_for_column_ids) 

這是可以在Python中做到的嗎?

謝謝!即使沒有辦法在Python中優雅地做到這一點,任何建議使上面的代碼更優雅,將非常感激。

:: EDIT ::

對於上下文中,屬性對象,z_matrix,和original_zmatrix是numpy的陣列的所有列表。

屬性可能是這樣的:

Type,Num,Phi,Psi,SecStruc,Front,Back 
11,181,-123.815,65.4652,2,3,19 
11,203,148.581,-89.9584,1,4,1 
11,181,-123.815,65.4652,2,3,19 
11,203,148.581,-89.9584,1,4,1 
11,137,-20.2349,-129.396,2,0,1 
11,163,-34.75,-59.1221,0,1,9 

的Z-矩陣可能都看起來像這樣:

CA-1, CA-2, CA-CB-1, CA-CB-2, N-CA-CB-SG-1, N-CA-CB-SG-2 
-16.801, 28.993, -1.189, -0.515, 118.093, 74.4629 
-24.918, 27.398, -0.706, 0.989, 112.854, -175.458 
-1.01, 37.855, 0.462, 1.442, 108.323, -72.2786 
61.369, 113.576, 0.355, -1.127, 111.217, -69.8672 

樣品是一個字典{NUM =>字典{NUM =>字典{NUM =>元組(屬性,z_matrix)}}},有一行的z矩陣。

+1

說英語,而不是代碼。你想達到什麼目的? – aIKid

+0

我有一個帶有屬性和值的樣本列表,我想用它們的屬性值將樣本組織成任意字典。我現在做的方式現在運行得非常好,而且速度驚人,但它不是很一般,這意味着每次我想以不同的方式組織示例時,我必須硬編碼一個新函數。所以現在它組織:dict [secstruc] [front] [back]。我希望能夠創建一個函數,將這三列作爲參數,並使用自定義groupby函數返回此字典。 – calben

+2

當然難以應付。你可以給一些樣本輸入/輸出嗎? –

回答

1

列表理解是一個偉大的結構,用於概括使用列表,以便可以優雅地管理列表的創建。是否有類似的工具來管理Python中的字典?

你試過使用詞典解析嗎?

看到這個great question about dictionary comperhansions

+0

這太棒了,謝謝!我會努力應用它並適當地編輯問題(或將其標記爲已接受的答案) – calben

+0

儘管Dictionary Comprehensions已被證明非常美麗,但我還沒有想出一種方法來使它們能夠製作深層次的字典。 您是否知道一種操作字典解析的方法,根據輸入列使解析任意多次運行? – calben

+0

@Kylamus,你的問題有很多信息,但我仍然沒有得到你想要做的。你能發佈你想做的事嗎? – Oz123