按字符串模式排序列表[重复]
Posted
技术标签:
【中文标题】按字符串模式排序列表[重复]【英文标题】:Sorting list by string pattern [duplicate] 【发布时间】:2022-01-12 00:57:06 【问题描述】:我有一个看起来像这样的文件列表:
listOfFiles = ['XLOG100.LOG', 'XLOG101.LOG', 'XLOG102.LOG', 'XLOG103.LOG', 'XLOG104.LOG', 'XLOG105.LOG', 'XLOG106.LOG', 'XLOG107.LOG', 'XLOG108.LOG', 'XLOG109.LOG', 'XLOG110.LOG', 'XLOG92.LOG', 'XLOG93.LOG', 'XLOG94.LOG', 'XLOG95.LOG', 'XLOG96.LOG', 'XLOG97.LOG', 'XLOG98.LOG', 'XLOG99.LOG']
需要从最大值到最小值进行排序。
我想出了在 XLOG 之后找到最大值并使用此算法创建一个新列表的想法。但是有没有更简单的方法来排序这个列表?也许我错过了什么。
文件的一般模式是:XLOGindex.LOG
,其中index
n > 1。
最终的结果应该是这样的:
listOfFiles = ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG', 'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG', 'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG', 'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG', 'XLOG93.LOG', 'XLOG92.LOG']
感谢您的任何想法;)
【问题讨论】:
你应该发布你当前的解决方案 【参考方案1】:您可以将函数sorted
与“键”函数结合使用。您的案例中的 key 函数提取文件名的数字部分(从第 4 位到负的第 4 位)并将其转换为数字:
sorted(listOfFiles, key=lambda x: int(x[4:-4]), reverse=True)
# ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG',
# 'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG',
# 'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG',
# 'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG',
# 'XLOG93.LOG', 'XLOG92.LOG']
【讨论】:
【参考方案2】:由于您只关心数字,因此您可以使用filter
过滤掉所有不是数字的内容;然后将结果转换为int
。
listOfFiles = ['XLOG100.LOG', 'XLOG101.LOG', 'XLOG102.LOG', 'XLOG103.LOG', 'XLOG104.LOG', 'XLOG105.LOG', 'XLOG106.LOG', 'XLOG107.LOG', 'XLOG108.LOG', 'XLOG109.LOG', 'XLOG110.LOG', 'XLOG92.LOG', 'XLOG93.LOG', 'XLOG94.LOG', 'XLOG95.LOG', 'XLOG96.LOG', 'XLOG97.LOG', 'XLOG98.LOG', 'XLOG99.LOG']
listOfFiles.sort(key=lambda s: int(''.join(filter(str.isdigit, s))), reverse=True)
print(listOfFiles)
# ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG', 'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG', 'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG', 'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG', 'XLOG93.LOG', 'XLOG92.LOG']
【讨论】:
【参考方案3】:您可以使用 python 列表排序功能对列表进行适当的排序。将参数 reverse=True
和 key=extract_index
与 extract_index
一起使用,该函数可以提取您在字符串中查找的索引
l = [
"XLOG100.LOG",
"XLOG101.LOG",
"XLOG102.LOG",
"XLOG103.LOG",
"XLOG104.LOG",
"XLOG105.LOG",
"XLOG106.LOG",
"XLOG107.LOG",
"XLOG108.LOG",
"XLOG109.LOG",
"XLOG110.LOG",
"XLOG92.LOG",
"XLOG93.LOG",
"XLOG94.LOG",
"XLOG95.LOG",
"XLOG96.LOG",
"XLOG97.LOG",
"XLOG98.LOG",
"XLOG99.LOG",
]
import re
def extract_index(s: str) -> int:
r = re.search(r"XLOG(\d+).LOG", s)
if r:
return int(r.group(1))
raise ValueError(f"Wrong pattern s")
l.sort(reverse=True, key=extract_index)
print(l)
>>> ['XLOG110.LOG', 'XLOG109.LOG', 'XLOG108.LOG', 'XLOG107.LOG', 'XLOG106.LOG', 'XLOG105.LOG', 'XLOG104.LOG', 'XLOG103.LOG', 'XLOG102.LOG', 'XLOG101.LOG', 'XLOG100.LOG', 'XLOG99.LOG', 'XLOG98.LOG', 'XLOG97.LOG', 'XLOG96.LOG', 'XLOG95.LOG', 'XLOG94.LOG', 'XLOG93.LOG', 'XLOG92.LOG']
【讨论】:
以上是关于按字符串模式排序列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章