按字符串模式排序列表[重复]

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=Truekey=extract_indexextract_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']

【讨论】:

以上是关于按字符串模式排序列表[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按特定属性对类列表进行排序[重复]

在Python中对字符串列表进行排序[重复]

数组列表排序[重复]

alpha 对具有相同整数值且应按升序排列的列表进行排序[重复]

按字符串值重复排序

按特定数据对字符串进行排序[重复]