我目前有一些代码,在给定一个列表的情况下,通过选择器中的regexp(用户定义)拆分名称,并通过键(位置-也是用户定义的)排序。你知道吗
键可以是按排序顺序排列的键列表。你知道吗
例如:
selector = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*'
key = [2,1,3]
按温度,电压,二次加工排序。你知道吗
代码的那部分工作得很好。现在,我需要帮助找出如何排序,如果给定一个自定义{键:顺序}配对词典。例如:
{
0: ['FF', 'TT', 'SS'],
3: ['SS', 'TT', 'FF']
}
基本上,这将按FF TT SS
顺序对键0
排序,然后按SS TT FF
顺序对键3
排序。你知道吗
以下是我目前掌握的情况:
import re
def sort_names(format_ids, selector, key=1, forced_order=None):
if isinstance(key, int):
key = [key]
def convert(x):
try:
return float(x[:-1])
except ValueError:
return x
def sort_keys(ik):
def split_fid(x):
x = re.findall(selector,x)[0]
return tuple([convert(x[i]) for i in ik])
return split_fid
if forced_order:
format_ids.sort(key=sort_keys(forced_order.keys()))
return list(format_ids)
else:
format_ids.sort(key=sort_keys(key))
return list(format_ids)
需要有关强制订单部分的帮助。我的意见是:
fids = ["synopsys_SS_2v_-40c_FF.lib",
"synopsys_SS_1v_-40c_TT.lib",
"synopsys_SS_1.2v_-40c_SS.lib",
"synopsys_SS_1.4v_-40c_SS.lib",
"synopsys_SS_2v_-40c_TT.lib",
"synopsys_FF_3v_25c_FF.lib",
"synopsys_TT_4v_125c_TT.lib",
"synopsys_TT_1v_85c_TT.lib",
"synopsys_TT_10v_85c_TT.lib",
"synopsys_FF_3v_-40c_SS.lib",
"synopsys_FF_3v_-40c_TT.lib"]
se = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*'
k = 3
fo = {
0: ['FF', 'TT', 'SS'],
3: ['SS', 'TT', 'FF']
}
retlist = sort_names(fids, se, k, fo)
强制订单部件的预期输出:
["synopsys_FF_3v_-40c_SS.lib",
"synopsys_FF_3v_-40c_TT.lib",
"synopsys_FF_3v_25c_FF.lib",
"synopsys_TT_4v_125c_TT.lib",
"synopsys_TT_1v_85c_TT.lib",
"synopsys_TT_10v_85c_TT.lib",
"synopsys_SS_1.2v_-40c_SS.lib",
"synopsys_SS_1.4v_-40c_SS.lib",
"synopsys_SS_1v_-40c_TT.lib",
"synopsys_SS_2v_-40c_TT.lib",
"synopsys_SS_2v_-40c_FF.lib"]
我将您在这里尝试的操作称为:类别排序。您正在传递的词典显示了如何对某些字段进行排序。但是你的字典没有,因为它不能,显示的是如何排序字段。Python dict在键上没有顺序。我建议保留key字段的含义,不管是否传入显示类别排序的
dict
。你知道吗代码:
至于如何利用
category_order
中的信息,我认为您需要将convert()
例程更改为:像这样称呼:
完整程序:
测试代码:
结果:
备用排序键结果:
提供:
相关问题 更多 >
编程相关推荐