使用 lambda 函数按两个子字符串对字符串列表进行排序

nat*_*142 2 python sorting string lambda

所以我有一个字符串列表,大致如下:

list = ['file.t00Z.wrff02.grib2', 'file.t00Z.wrff03.grib2', 'file.t00Z.wrff00.grib2',
        'file.t00Z.wrff05.grib2', 'file.t00Z.wrff04.grib2', 'file.t00Z.wrff01.grib2', 
        'file.t06Z.wrff01.grib2', 'file.t06Z.wrff00.grib2', 'file.t06Z.wrff02.grib2', ...]
Run Code Online (Sandbox Code Playgroud)

我最近在这里问了一个问题,其中我学习了如何使用 lambda 函数按子字符串对字符串列表进行排序:

list.sort(key=lambda x: x[x.find('wrff'):])

但现在我需要知道是否有一种方法可以按两个不同的子字符串进行排序,就像数据库中的复合主键一样。我想首先按“file.t”后面的两位数字对文件进行排序,然后按“wrff”后面的两位数字对文件进行排序。有没有办法可以同时执行这两个操作?

解决方案:我最终使用了用户 Moses Koledoye 在下面推荐的二元组 lambda 函数排序,但在尝试将此排序过程应用于具有不同命名约定的文件名组时遇到了问题。

在我的脚本中,我有 3 个 Python 对象,它们从唯一的数据目录中抓取文件并形成一个包含文件的列表(如上面的列表)。每个对象抓取具有不同命名约定的文件,并且每个不同的文件组在其名称中具有不同数量的数字组。

为了在不增加复杂性的情况下处理这个问题,我决定使用用户 Jared Gougen 建议的natsort模块,并且效果非常好。

Mos*_*oye 5

您可以re.findall选择前两位数字,然后使用它们在 2 元组中进行排序:

import re

lst = sorted(lst, key=lambda x: tuple(int(i) for i in re.findall('\d+', x)[:2]))
print(lst)
# ['file.t00Z.wrff00.grib2', 'file.t00Z.wrff01.grib2', 'file.t00Z.wrff02.grib2', 
#  'file.t00Z.wrff03.grib2', 'file.t00Z.wrff04.grib2', 'file.t00Z.wrff05.grib2', 
#  'file.t06Z.wrff00.grib2', 'file.t06Z.wrff01.grib2', 'file.t06Z.wrff02.grib2', ...]
Run Code Online (Sandbox Code Playgroud)

这将取后面的第一个数字file.t,然后是后面的数字wrff

  • @ChristianDean 确实有一点,这将捕获杂散的 1 位序列和不在请求的子字符串之后的序列(这可能是也可能不是问题)。 (3认同)