在Python中将排序优雅地推广到字典中?

在Python中将排序优雅地推广到字典中?,python,dictionary,numpy,Python,Dictionary,Numpy,列表理解是一种很好的概括列表的结构,它可以优雅地管理列表的创建。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 = a

列表理解是一种很好的概括列表的结构,它可以优雅地管理列表的创建。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中没有一种优雅的方法,任何关于使上述代码更加优雅的建议都将不胜感激

::编辑::

对于上下文,属性对象、z_矩阵和原始z矩阵都是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
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
Z矩阵可能都是这样的:

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
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
Samples是一个dict{num=>dict{num=>dict{num=>tuple(attributes,z_-matrix)}},具有一行z-矩阵

列表理解是一种很好的概括列表的结构,它可以优雅地管理列表的创建。Python中是否有类似的词典管理工具

你试过使用字典理解吗

看到这个了吗

列表理解是一种很好的概括列表的结构,它可以优雅地管理列表的创建。Python中是否有类似的词典管理工具

你试过使用字典理解吗



请参见此

讲英语,而不是代码。你想完成什么?我有一个带有属性和值的样本列表,我想根据它们的属性值将样本组织到任意字典中。我现在使用的方法运行得非常好,速度惊人地快,但它不是非常通用,这意味着每当我想以不同的方式组织示例时,我必须硬编码一个新函数。所以现在它组织起来了:dict[secstruc][front][back]。我希望能够创建一个函数,该函数将这三列作为参数,并使用自定义groupby函数返回此字典。这确实很难实现。您能给出一些示例输入/输出吗?您的
属性
值包含什么?这似乎是一种两级结构(可能是一个
list
of
dict
s?),但我不清楚这些级别的含义是什么。属性、z_矩阵和原始z_矩阵都是numpy数组的列表,代表用于分析的样本,其中属性是特征,z_矩阵是一组数值(这是来自生化和化学的z矩阵)将样本输入和输出编辑到问题中!说英语,而不是代码。你想完成什么?我有一个带有属性和值的样本列表,我想根据它们的属性值将样本组织到任意字典中。我现在这样做的方式非常有效,速度惊人,但不是很一般,我认为aning每次我想以不同的方式组织样本时,我都必须硬编码一个新函数。所以现在它组织起来了:dict[secstruc][front][back]。我希望能够创建一个函数,将这三列作为参数,并使用自定义groupby函数返回此字典。确实很难处理。您能给出一些示例输入/输出吗?您的
属性
值包含什么?它似乎是某种两级结构(可能是
dict
s的
列表
),但我不清楚级别的含义。属性、z_矩阵和原始z_矩阵都是numpy数组的列表,表示分析样本,其中属性是特征,z_矩阵是一组数值(这是来自生化和化学的z矩阵)将示例输入和输出编辑到问题中!这很好,谢谢!我将努力应用它并适当编辑问题(或将此标记为已接受的答案)虽然字典理解已经被证明是美丽的,但我还没有找到一种方法来使用它们使字典达到n级深度。你知道一种方法来操纵字典理解,使其根据输入列任意运行多次吗?@Kylamus,你的问题有很多信息,但我仍然不知道t你想做什么。你能发布你想做什么吗?本质上,更一般地说,我希望能够创建一个创建n层字典的函数。因此,如果我给函数4个参数,它将成为dict{k->dict{k->dict{k->dict}。如果我通过它2,它将是dict{k->dict}}。这有意义吗?我正在使用字典来组织数据列,并希望能够任意执行此操作。这在NumPy中尚未实现。@Kylamus,什么是
dict{k->dict}}
为什么使用嵌套字典如此重要?
?请重新编辑您的问题并输入、调用函数和预期输出。这很好,谢谢!我将努力应用它并适当编辑问题(或将此标记为已接受的答案)虽然字典理解已经被证明是美丽的,但我还没有找到一种方法来使用它们使字典达到n级深度。你知道一种方法来操纵字典理解,使其根据输入列任意运行多次吗?@Kylamus,你的问题有很多信息,但我仍然不知道t你想做什么。你能发布你想做什么吗?本质上,更一般地说,我希望能够创建一个创建n层字典的函数。因此,如果我给函数4个参数,它将使dict{k->dict{k->