刚刚开始处理python并且难以按多个/不同数量的匹配对字符串列表进行排序。基本上,给定一个字符串列表,我需要按给定的正则表达式(用户提供)拆分每个字符串,然后按给定的键列表(位置)排序。密钥可以是单个整数,也可以是按顺序排列的列表。例如:
regex = r'。(FF | TT | SS)_([ - 。\ d] + v)_([ - 。\ d] + c)_(FF | TT | SS) '
key = [2,1,3]
将按位置2,位置1,位置3对字符串列表进行排序。
我有以下内容适用于固定数量的位置/键,但无法弄清楚如何使用不同数量的键进行操作':
import re
strlist = ["synopsys_SS_2v_-40c_SS.lib","synopsys_SS_1v_-40c_SS.lib","synopsys_SS_2v_-40c_TT.lib","synopsys_FF_3v_-40c_FF.lib", "synopsys_TT_4v_125c_TT.lib", "synopsys_TT_1v_-40c_TT.lib"]
regex = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*'
key = [2,1,3]
sfids_single = sorted(strlist, key=lambda name: (
re.findall(regex,name)[0][key[0]],
re.findall(regex,name)[0][key[1]],
re.findall(regex,name)[0][key[2]]))
尝试以下操作,但似乎不起作用:
fids_single = sorted(strlist, key=lambda name: (re.findall(regex,name)[0][i] for i in key))
也尝试过(没有成功):
for i in key:
strlist.sort(key=lambda name: re.findall(regex,name)[0][key[i]])
预期结果:
['synopsys_SS_1v_-40c_SS.lib', 'synopsys_TT_1v_-40c_TT.lib', 'synopsys_SS_2v_-40c_SS.lib', 'synopsys_SS_2v_-40c_TT.lib', 'synopsys_FF_3v_-40c_FF.lib', 'synopsys_TT_4v_125c_TT.lib']
我完全走错了路吗?非常感谢任何指导。
答案 0 :(得分:2)
编写一个键函数,它将按优先顺序返回每个字符串的相关部分,并将该函数用于排序键。
one = ["synopsys_SS_2v_-40c_SS.lib","synopsys_SS_1v_-40c_SS.lib",
"synopsys_SS_2v_-40c_TT.lib","synopsys_FF_3v_-40c_FF.lib",
"synopsys_TT_4v_125c_TT.lib", "synopsys_TT_1v_-40c_TT.lib"]
expected = ['synopsys_SS_1v_-40c_SS.lib', 'synopsys_TT_1v_-40c_TT.lib',
'synopsys_SS_2v_-40c_SS.lib', 'synopsys_SS_2v_-40c_TT.lib',
'synopsys_FF_3v_-40c_FF.lib', 'synopsys_TT_4v_125c_TT.lib']
使用正则表达式拆分字符串;
import operator, re
pattern = r'.*(FF|TT|SS)_([-\.\d]+v)_([-\.\d]+c)_(FF|TT|SS).*'
rx = re.compile(pattern)
seq = [2,1,3]
def key(item, seq = seq):
seq = operator.itemgetter(*seq)
a, b, c, d = rx.findall(item)
return seq([a, b, c, d])
one.sort(key = key)
assert one == expected
可以在不使用正则表达式的情况下编写关键函数,这可能会使其稍微复杂一些。
def key(item, seq = seq):
seq = operator.itemgetter(*seq)
_, a, b, c, d = item.split('_')
d, _ = d.split('.')
print a, b, c, d
return seq([a, b, c, d])
您可能希望使用比a, b, c, d
更具描述性的名称。它依赖于具有相同模式的字符串。
答案 1 :(得分:1)
非常感谢@a_guest提供了难题的缺失部分。这是工作解决方案:
fids_single = sorted(strlist, key=lambda name: tuple(re.findall(regex,name)[0][i] for i in key))