根据子字符串分割和排序列表



我正在尝试从数组中获取列表,然后将字符串分开以按6个数字的最后一个系列(例如'042126(按顺序对列表进行排序。为此,我将用'。'分开,使用字符串[-2]的最后一个分开,然后用此子字符串对Matchfiles [1]进行分类。

文件最终应分类为:ERL1.041905,ERL1.041907,ERL2.041908,ERL1.041909,ERL2.041910等

两个问题:我如何指定每个字符串的无限数量分配数(如果使用其他'?我使用4个拆分,但这种情况可能无法持有。向后工作?

更重要的是,我返回了一个错误:"列表"对象无法call。我在做什么错?

谢谢

matchfiles = [ [1723], ['blue.2017-09-05t15-15-07.erl1.041905.png', 
                        'blue.2017-09-05t15-15-11.erl1.041907.png', 
                        'blue.2017-09-05t15-15-14.erl1.041909.png', 
                        'blue.2017-09-05t14-21-35.erl2.041908.png', 
                        'blue.2017-09-05t14-21-38.erl2.041910.png', 
                        'blue.2017-09-05t14-21-41.erl2.041912.png', 
                        'blue.2017-09-05t14-21-45.erl2.041914.png'], 
                        [09302] ]
matchtry = sorted(matchfiles[1], key = [i.split('.', 4)[-2] for i in 
matchfiles[1]])
  • key参数期望一个函数,但是您给它列表,因此错误 list is not callable

  • 您应该使用split('.')[-2],它总是将第二个元素占据第二个元素。


matchfiles = [ [1723], ['blue.2017-09-05t15-15-07.erl1.041905.png',
                        'blue.2017-09-05t15-15-11.erl1.041907.png',
                        'blue.2017-09-05t15-15-14.erl1.041909.png',
                        'blue.2017-09-05t14-21-35.erl2.041908.png',
                        'blue.2017-09-05t14-21-38.erl2.041910.png',
                        'blue.2017-09-05t14-21-41.erl2.041912.png',
                        'blue.2017-09-05t14-21-45.erl2.041914.png'],
                        [9302] ]
matchtry = sorted(matchfiles[1], key=lambda x: x.rsplit('.')[-2])
print(matchtry)
# ['blue.2017-09-05t15-15-07.erl1.041905.png', 'blue.2017-09-05t15-15-11.erl1.041907.png', 
   'blue.2017-09-05t14-21-35.erl2.041908.png', 'blue.2017-09-05t15-15-14.erl1.041909.png',
   'blue.2017-09-05t14-21-38.erl2.041910.png', 'blue.2017-09-05t14-21-41.erl2.041912.png',
   'blue.2017-09-05t14-21-45.erl2.041914.png']

key参数到 sorted需要一个函数。[i.split('.', 4)[-2] for i in matchfiles[1]]是列表,而不是函数。预期函数在列表中的单个元素上作用,因此您需要一个函数,该函数将字符串分配在'。字符,并返回第二列,可能会转换为整数。

另外,Python不允许整数以零开始,因此您必须将[09302]更改为[9302]。(以 0开头表示该数字将是非确定的。在Python 2中,0427为427 Octal,但在Python 3中,必须先于0o,而是09302。包含9。(

matchfiles = [ [1723], ['blue.2017-09-05t15-15-07.erl1.041905.png',
                        'blue.2017-09-05t15-15-11.erl1.041907.png',
                        'blue.2017-09-05t15-15-14.erl1.041909.png',
                        'blue.2017-09-05t14-21-35.erl2.041908.png',
                        'blue.2017-09-05t14-21-38.erl2.041910.png',
                        'blue.2017-09-05t14-21-41.erl2.041912.png',
                        'blue.2017-09-05t14-21-45.erl2.041914.png'],
                        [9302] ]
matchtry = sorted(matchfiles[1], key = lambda str: int(str.split('.')[-2]))

请记住,排序的关键参数将您的每个元素(在您的情况下列出(并将其转换为某个值。通过密钥转换后每个元素的值确定排序顺序。因此,每次使此操作的一种简单方法是定义一个函数获取一个元素并将其转换为易于排序的东西:

def fname_to_value(fname):
    name, ext = os.path.splitext(fname) # remove extension 
    number = name.split('.')[-1]  # Get the last set of stuff after the last '.'
    return number  # no need to convert to int, string compare does what you want

因此,现在您有一个函数将文件名转换为可排序值。简单地将其作为关键参数排序,然后完成。

matchtry = sorted(matchfiles[1], key = fname_to_value)
for match in matchtry:
    print(match)

结果:

blue.2017-09-05t15-15-07.erl1.041905.png
blue.2017-09-05t15-15-11.erl1.041907.png
blue.2017-09-05t14-21-35.erl2.041908.png
blue.2017-09-05t15-15-14.erl1.041909.png
blue.2017-09-05t14-21-38.erl2.041910.png
blue.2017-09-05t14-21-41.erl2.041912.png
blue.2017-09-05t14-21-45.erl2.041914.png

然后,您可以根据需要处理结果列表。

是的,问题是您的密钥。您可以使用lambda表达式:https://en.wikipedia.org/wiki/anonymous_function#python

想象这是数学图。用于排序的键需要一个函数,因此您定义了一个lambda,例如:

lambda curr: curr.split('.')[-2]

这给出列表中的每个当前对象的名称为" Curr",并在以下内容之后应用了表达式。因此,就您而言,这应该做到:

matchtry = sorted(matchfiles[1], key=lambda curr: curr.split('.')[-2])

最新更新