Понимание списка - отличная структура для обобщения работы со списками таким образом, что создание списков можно управлять элегантно. Есть ли аналогичный инструмент для управления словарями в 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-матрицы.
Говорите по-английски, а не по коду. Что вы пытаетесь достичь? – aIKid
У меня есть список образцов с атрибутами и значениями, я бы хотел организовать выборки в произвольные словари по их значениям атрибутов. То, как я делаю это сейчас, работает очень хорошо и на удивление быстро, но это не очень общий, то есть я должен жестко программировать новую функцию каждый раз, когда я хочу упорядочить образцы по-разному. Итак, сейчас он организует: dict [secstruc] [front] [назад]. Я хотел бы иметь возможность сделать функцию, которая принимает эти три столбца в качестве параметров и возвращает этот словарь, используя пользовательскую функцию groupby. – calben
Неверный наверняка. Можете ли вы дать несколько примеров ввода/вывода? –