1

我想对我在嵌套循环中生成的字典进行自定义排序。我知道五条记录将永远存在,但根据我浏览的数据可能还有其他记录。我本质上希望这五条记录按特定顺序排列,然后顺序对于这五条之后的所有记录都无关紧要。

例如,我想要这个:

{"Entries": [], "Groups": [], "Admin": [], "Network": [], "XYZ": [], "Subnets": []}

排序为:

{"Admin": [], "Groups": [], "Network": [], "Subnets": [], "Entries": [], "XYZ": []}

因此,Admin、Groups、Network、Subnets 和 Entries 是我想要在字典开头按特定顺序排列的五个,之后其余条目的顺序无关紧要。我怎样才能做到这一点?

4

5 回答 5

3

你需要collections.OrderedDict ……

因此,基于此,解决方案类似于:

def custom_order(dct, spec):
    """
    dct - the dictionary
    spec - a list of dedicated keys
    """
    res = collections.OrderedDict()
    dct = dict(dct)
    for key in spec:
        if key in dct:
            res[key] = dct.pop(key)
    res.update(dct.items())
    return res
于 2012-11-14T16:49:32.963 回答
3

你首先需要

  • 通过获取项目列表创建(键,值)对列表
  • 自定义排序生成的列表
  • 根据排序结果创建 OrderedDict

这是一个示例,我根据键的长度对数据进行排序

>>> from collections import OrderedDict
>>> some_dict = {"Entries": [], "Groups": [], "Admin": [], "Network": [], "XYZ": [], "Subnets": []}
>>> some_dict = OrderedDict(sorted(some_dict.items(),key = lambda e:len(e[0])))
>>> some_dict
OrderedDict([('XYZ', []), ('Admin', []), ('Groups', []), ('Subnets', []), ('Network', []), ('Entries', [])])
于 2012-11-14T16:56:48.773 回答
1

将数据存储为对列表。

于 2012-11-14T16:52:48.243 回答
0

我重新考虑了如何处理整个情况,并找到了一种适合我的方法。

使用如下数据集:

{"Entries": [], "Groups": [], "Admin": [], "Network": [], "XYZ": [], "Subnets": []}

我只是执行以下操作,这对我来说很好:

for menu in ["Admin", "Groups", "Network", "Subnets", "Entries"]:
    try:
        doWork(my_dataset[menu])
        del my_dataset[menu]
    except KeyError:
        # The user might not have any entries for that menu, so don't worry about it
        pass
for menu in my_dataset.keys():
    doWork(my_dataset[menu])

所以基本上,对这五个项目做我需要做的事情,然后从数据集中删除它们。我很乐意这样做,因为在这段代码之后我没有使用所述数据集。在我处理完剩下的那些之后,我不会删除它们,因为那是不必要的。垃圾回收只会在函数完成后吹走整个数据集,对吧?

于 2012-11-15T16:34:48.213 回答
0

我遇到了完全相同的问题,并设计了一个轻量级的通用解决方案:

from collections import OrderedDict

def make_custom_sort(orders):
    orders = [{k: -i for (i, k) in enumerate(reversed(order), 1)} for order in orders]
    def process(stuff):
        if isinstance(stuff, dict):
            l = [(k, process(v)) for (k, v) in stuff.items()]
            keys = set(stuff)
            for order in orders:
                if keys.issuperset(order):
                    return OrderedDict(sorted(l, key=lambda x: order.get(x[0], 0)))
            return OrderedDict(sorted(l))
        if isinstance(stuff, list):
            return [process(x) for x in stuff]
        return stuff
    return process

首先,您创建一个自定义顺序排序函数的实例:

custom_sort = make_custom_sort([ ["Admin", "Groups", "Network", "Subnets", "Entries"] ])

现在,实际排序:

result = custom_sort(my_dataset)

丢失的键最终以未指定的顺序被拒绝。请注意,此闭包是递归的。如双括号所示,您可以指定嵌套在结构中的各种字典所需的排序顺序。

GitHub上的项目:https ://github.com/laowantong/customsort

于 2014-07-29T20:14:18.303 回答