2013-11-26 4 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.

Что еще более важно, я хотел бы иметь возможность обобщить эту функцию лучше, чтобы я мог указать, сколько «слоев» должно быть в словаре (без использования нескольких лямбда и приближения к проблеме в стиле Лиспа). Я хотел бы:

# 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 => ДИКТ {номер => кортеж (атрибуты, z_matrix)}}}, имеющий одну строку z-матрицы.

+1

Говорите по-английски, а не по коду. Что вы пытаетесь достичь? – aIKid

+0

У меня есть список образцов с атрибутами и значениями, я бы хотел организовать выборки в произвольные словари по их значениям атрибутов. То, как я делаю это сейчас, работает очень хорошо и на удивление быстро, но это не очень общий, то есть я должен жестко программировать новую функцию каждый раз, когда я хочу упорядочить образцы по-разному. Итак, сейчас он организует: dict [secstruc] [front] [назад]. Я хотел бы иметь возможность сделать функцию, которая принимает эти три столбца в качестве параметров и возвращает этот словарь, используя пользовательскую функцию groupby. – calben

+2

Неверный наверняка. Можете ли вы дать несколько примеров ввода/вывода? –

ответ

1

Понимание списка - отличная структура для обобщения работы со списками таким образом, что создание списков можно управлять элегантно. Есть ли аналогичный инструмент для управления словарями в Python?

Вы пытаетесь использовать словарные знания?

см. Это great question about dictionary comperhansions

+0

Это замечательно, спасибо! Я буду работать над ее применением и соответствующим образом отредактировать вопрос (или отметить это как принятый ответ). – calben

+0

В то время как Словарь Пояснения оказались прекрасными, я не понял способ использовать их, чтобы сделать словари n уровней глубокими. Знаете ли вы, как манипулировать пониманием словаря, чтобы заставить понимание выполняться произвольно много раз в зависимости от входных столбцов? – calben

+0

@Kylamus, у вашего вопроса много информации, но я до сих пор не понимаю, что вы хотите сделать. Можете ли вы опубликовать то, что хотите? – Oz123

Смежные вопросы