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> >是的,单输入字典的列表会做到这一点。是的,单输入字典的列表会做到这一点。