【问题标题】:How do I sort a list by specific characters within each element?如何按每个元素中的特定字符对列表进行排序?
【发布时间】:2016-06-07 02:14:17
【问题描述】:

我被要求定义一个根据文件扩展名对列表进行排序的函数..

我了解排序,但我不明白如何从“.”开始排序字符。

我想要以下结果:

>>> extsort(['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c'])
['a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']

【问题讨论】:

  • 阅读key参数
  • 查看 sort 并提供一个 lambda 函数来解析和反转文件名和扩展名,因此从 file.ext 开始在 lambda 中返回 ext.file。这适用于 John Coleman 的项目。

标签: python list function sorting sorted


【解决方案1】:

您可以将key函数作为sorted的参数传递:

>>> l = ['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c']
>>> sorted(l, key=lambda x: splitext('.')[1])
['a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'x.c']

如果您需要将具有相同扩展名的文件按名称排序,您可以更改键功能以反转拆分结果:

>>> l = ['x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'a.c']
>>> sorted(l, key=lambda x: splitext(x)[::-1])
['a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']

【讨论】:

  • 对于l = ['x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt', 'a.c'],我认为您的解决方案不正确。输出是['x.c', 'a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt'],我认为作者想要['a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']
  • 好的,我只看到一个问题..在 lambda 函数末尾指定的 [1] 是什么?
  • @BlackMamba 好吧,可能。 OP没有指定是否必须对给定扩展名的值进行排序。
  • @BlackMamba 怎么样?我得到了结果['x.c', 'a.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt'],其中文件按扩展名排序。该问题没有说明如何对具有相同扩展名的文件进行排序,以便对它们进行相同的处理。
  • @niemmi 如果你想满足所有的仇敌,你可以使用lambda x: (x.rsplit('.', 1)[1], x)
【解决方案2】:

对于即使某些文件没有扩展名(并且更加自记录)也能工作的解决方案,请使用os.path.splitext 作为sortedkey 函数的一部分。当没有文件扩展名时,它会将扩展名视为空字符串,'',将其排在所有其他扩展名之前:

>>> l = ['b.py', 'a.c', 'a.py', 'bar.txt', 'foo.txt', 'x.c', 'foo']
>>> sorted(l, key=lambda x: os.path.splitext(x)[1])
['foo', 'a.c', 'x.c', 'b.py', 'a.py', 'bar.txt', 'foo.txt']

注意b.py 在这里排在a.py 之前,因为它出现在输入的最前面,并且排序只针对文件扩展名。要使其按扩展名排序,然后是全名,键在扩展名的元组上,后跟非扩展名名称(通过使用 [::-1] 切片 os.path.splitext 的返回值很容易完成,这反转了返回元素的顺序) ,所以a.py 位于b.py 之前,无论它们出现在输入中的什么位置:

>>> sorted(l, key=lambda x: os.path.splitext(x)[::-1])
['foo', 'a.c', 'x.c', 'a.py', 'b.py', 'bar.txt', 'foo.txt']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多