Python按自定义排序{键:顺序}排

2024-10-06 12:27:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前有一些代码,在给定一个列表的情况下,通过选择器中的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"]

Tags: keyidsformatreturn排序顺序libdef
1条回答
网友
1楼 · 发布于 2024-10-06 12:27:16

我将您在这里尝试的操作称为:类别排序。您正在传递的词典显示了如何对某些字段进行排序。但是你的字典没有,因为它不能,显示的是如何排序字段。Python dict在键上没有顺序。我建议保留key字段的含义,不管是否传入显示类别排序的dict。你知道吗

代码:

至于如何利用category_order中的信息,我认为您需要将convert()例程更改为:

def convert(i, x):
    if i in category_order:
        return category_order[i].index(x)
    try:
        return float(x[:-1])
    except ValueError:
        return x

像这样称呼:

return tuple([convert(i, fields[i]) for i in key])

完整程序:

def sort_names(format_ids, selector, key=1, category_order=None):

    if isinstance(key, int):
        key = [key]

    if category_order is None:
        category_order = {}

    SELECTOR_RE = re.compile(selector)

    def convert(i, x):
        if i in category_order:
            return category_order[i].index(x)
        try:
            return float(x[:-1])
        except ValueError:
            return x

    def sort_keys():
        def split_fid(fid):
            fields = SELECTOR_RE.findall(fid)[0]
            return tuple([convert(i, fields[i]) for i in key])
        return split_fid

    result = list(format_ids)
    result.sort(key=sort_keys())
    return result

测试代码:

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 = [0, 3]
fo = {
      0: ['FF', 'TT', 'SS'],
      3: ['SS', 'TT', 'FF']
     }

print('\n'.join(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

备用排序键结果:

print('\n'.join(sort_names(fids, se, [2, 1, 3], fo)))

提供:

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_SS_2v_-40c_FF.lib
synopsys_FF_3v_-40c_SS.lib
synopsys_FF_3v_-40c_TT.lib
synopsys_FF_3v_25c_FF.lib
synopsys_TT_1v_85c_TT.lib
synopsys_TT_10v_85c_TT.lib
synopsys_TT_4v_125c_TT.lib

相关问题 更多 >