【问题标题】:Sort a python list of strings with a numeric number用数字对字符串的python列表进行排序
【发布时间】:2016-05-10 15:13:59
【问题描述】:

我有一个名为 filelist

的文件名列表
 In []: filelist
Out []: ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
         'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx',
         'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx']

我想按加粗位置的数值对这个文件列表进行排序

C:\Mon20412\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx
C:\Mon25312\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx
C:\Mon20362\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx

所以在这个例子中,输出将是

Out []: ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
         'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx'
         'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx']

谢谢!

【问题讨论】:

  • 您是否尝试过从文件路径中提取数字?一旦你有了它,排序就变得微不足道了。
  • 请提供您目前尝试过的代码。

标签: python string list sorting numerical


【解决方案1】:

找到一种好的、可靠的方法来提取您想要的数字。然后使用key 参数按该数字排序。对于您的输入,这似乎足够可靠,但效率不高。

a = ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
    'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx',
    'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx']

def k(a):
    x = a.split("\\")[-1].split("-")[3]
    y = filter(lambda x: x in "0123456789", x)
    return int("".join(list(y)))


print(sorted(a, key=k))

输出:

['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx', 
'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx',
'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx']

【讨论】:

    【解决方案2】:
    import re
    
    f = lambda s: int(re.findall(r'.*RAID6-(\d+).*', s)[0])
    sorted(l, key=f)
    

    【讨论】:

      【解决方案3】:

      使用正则表达式解析出数字并将其用作排序键。

      又快又脏:

      import re
      
      l = ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
           'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx',
           'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx']
      
      def get_sort_number(s):
          pattern = r'C:\\Mon\d+\\P-2NODE-RAID6-(\d+)'
      
          try:
              return int(re.match(pattern, s).group(1))
          except AttributeError:
              return 0
      
      sorted(l, key=get_sort_number)
      

      这给了

      ['C:\\Mon20412\\P-2NODE-RAID6-1BLACK-32k-100-segmented.xlsx',
       'C:\\Mon20362\\P-2NODE-RAID6-2GREEN-32k-100-segmented.xlsx',
       'C:\\Mon25312\\P-2NODE-RAID6-13RED-32k-100-segmented.xlsx']
      

      正则表达式无法匹配的所有字符串都将位于排序列表的开头。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-02
        • 2012-11-26
        • 1970-01-01
        • 2020-03-07
        • 2018-07-02
        相关资源
        最近更新 更多