【问题标题】:python sort strings with leading numbers alphabeticallypython按字母顺序对带有前导数字的字符串进行排序
【发布时间】:2018-01-26 20:44:31
【问题描述】:

我有一个文件名列表,每个文件名都以前导数字开头:

10_file
11_file
1_file
20_file
21_file
2_file ...

我需要按这个顺序排列:

1_file
10_file
11_file
2_file
21_file
22_file ...

如果它们只是没有下划线的字符串形式的数字 ('1'),我可以使用 sorted() 对它们进行排序。我尝试了具有不同键属性的不同排序方法,还有模块“natsort”,但没有结果。我必须为此编写自己的算法吗?也许我可以提取前导数字并使用它们进行排序?

更新所需列表以更正列表

【问题讨论】:

  • 文件名前的最大数字是多少?
  • 视情况而定。最多 120 个。
  • 好的,所有文件名都以_file 结尾吗?
  • 不,那是不同字符的不同字符串。但在每种情况下,前导数字后面都有一个下划线。
  • 您能解释一下为什么11_file12_file2_file 之后按照您想要的排序顺序吗?

标签: python string sorting alphabetical-sort


【解决方案1】:

排序、拆分和列表推导在这里工作得很好。

lst = ['10_file', '11_file', '1_file', '20_file', '21_file', '2_file']

lst_split = ['_'.join(x) for x in sorted(i.split('_') for i in lst)]

# ['1_file', '10_file', '11_file', '2_file', '20_file', '21_file'] 

【讨论】:

  • 嗯,我发现关键一更容易阅读。部分原因是它短得多。你是如何衡量这个的?对我来说,你的方式较慢(如我所料):ideone.com/GUcVhW
  • ... 以及更短的版本,因为它的副作用,我无法将其包含在该基准测试中:lst.sort(key=lambda s: s.split('_'))
  • @StefanPochmann,我使用了%timeit 与 Ajax1234 的解决方案。
【解决方案2】:

使用 OP 真正想要的内容进行编辑:

>>> from functools import partial
>>> lst = ['10_file', '11_file', '1_file', '20_file', '21_file', '2_file']
>>> sorted(lst, key=partial(str.split, sep='_', maxsplit=1))
['1_file', '10_file', '11_file', '2_file', '20_file', '21_file']

【讨论】:

    【解决方案3】:

    这个怎么样:

    flist = ['10_file',
            '11_file',
            '1_file',
            '20_file',
            '21_file',
            '2_file']
    
    tempdict = {}
    
    for item in flist:
        num = item.split('_')[0]
        tempdict[num] = item
    
    output = []
    
    # for truly numeric sorting
    #for k in sorted([int(k) for k in tempdict.keys()]):
        #output.append(tempdict[str(k)])
    
    # for alphabetical sorting:
    for k in sorted(tempdict.keys()):
        output.append(tempdict[k])
    
    print('\n'.join(output))
    

    结果

    1_file
    10_file
    11_file
    2_file
    20_file
    21_file
    

    【讨论】:

    • 请注意:print("") 适用于 Python2 和 Python3。 print "" 仅适用于 Python2
    • 我投了反对票,因为这会消除所有重复的数字。
    • @JacobIRR 这行得通。似乎是解决问题的正确方法。我必须弄清楚在我的环境中实施(第一次尝试在真实列表上我收到错误ValueError: too many values to unpack (expected 2)。但是使用你的列表它可以工作。
    • 您可以通过将num, name = item.split('_') 更改为num, name = item.split('_')[0] 来防止该值错误
    【解决方案4】:

    简单的方法。只需提取数字,然后将其排序为字符串:

    sorted(l, key=lambda s: s.split("_")[0] )

    这就是你所需要的...尝试:

    l=['2_file', '10_file', '11_file', '1_file', '20_file', '21_file']
    print "\n".join(sorted(l, key=lambda s: s.split("_")[0] ))
    1_file
    10_file
    11_file
    2_file
    20_file
    21_file
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多