Python中字典上的自定义排序?

Python中字典上的自定义排序?,python,python-2.6,Python,Python 2.6,我想对嵌套循环中生成的字典进行自定义排序。我知道总有五条记录,但根据我所查阅的数据,可能还有其他记录。我基本上希望这五条记录有一个特定的顺序,然后顺序对这五条记录之后的所有记录都不重要 例如,我想要这个: {"Entries": [], "Groups": [], "Admin": [], "Network": [], "XYZ": [], "Subnets": []} 要按此分类: {"Admin": [], "Groups": [], "Network": [], "Subnets": [

我想对嵌套循环中生成的字典进行自定义排序。我知道总有五条记录,但根据我所查阅的数据,可能还有其他记录。我基本上希望这五条记录有一个特定的顺序,然后顺序对这五条记录之后的所有记录都不重要

例如,我想要这个:

{"Entries": [], "Groups": [], "Admin": [], "Network": [], "XYZ": [], "Subnets": []}
要按此分类:

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

你需要这样做

因此,基于此,解决方案如下:

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
你需要这样做

因此,基于此,解决方案如下:

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

将数据存储为对列表。

将数据存储为对列表。

首先需要

  • 通过获取项目列表来创建(键、值)对列表
  • 对生成的列表进行自定义排序
  • 根据排序结果创建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', [])])
你首先需要

  • 通过获取项目列表来创建(键、值)对列表
  • 对生成的列表进行自定义排序
  • 根据排序结果创建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', [])])

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

使用如下所示的数据集:

{"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])

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

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

使用如下所示的数据集:

{"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])

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

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

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上的项目:

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

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上的项目:

您能解释一下为什么需要这样做吗?这个问题的上下文是什么?python中的字典没有排序。字典是哈希表,而不是序列。如果是因为你直接打印字典,那你就做错了。考虑<代码>打印(“admin:{admin },组:{组},…,**YuyDICT)< /Cord>)您能解释一下为什么需要这样做吗?这个问题的上下文是什么?python中的字典没有排序。字典是哈希表,而不是序列。如果是因为你直接打印字典,那你就做错了。考虑<代码>打印(Admin:{admin },组:{组},…,**YuyDICT)< /Cord> >是的,单输入字典的列表会做到这一点。是的,单输入字典的列表会做到这一点。