根据字符串中的数字排序字符串列表

时间:2016-03-28 09:47:30

标签: python list sorting

例如我有清单

my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']

my_list.sort()

给了我

['image1.jpg', 'image101.jpg', 'image2.jpg']

但我当然需要

['image1.jpg', 'image2.jpg', 'image101.jpg']

怎么做?

4 个答案:

答案 0 :(得分:8)

list.sort接受可选的public class DataItem { public int ID { get; set; } public string Name { get; set; } public DataItem RefItem { get; set; } } public class Checker { public static bool Check(DataItem item) { var chain = new Dictionary<DataItem, DataItem>(); chain.Add(item, null); try { ProcessNodes(chain, item); return true; } catch (ArgumentException) { return false; } } private static void ProcessNodes(Dictionary<DataItem, DataItem> chain, DataItem item) { if (item.RefItem != null) { chain.Add(item.RefItem, null); ProcessNodes(chain, item.RefItem); } } public static bool ValidateDataItems(List<DataItem> items) { foreach(var item in items) if(!Check(item)) return false; return true; } } public static void Main() { var item1 = new DataItem() { ID = 1, Name = "First Item", RefItem = null }; var item2 = new DataItem() { ID = 1, Name = "First Item", RefItem = item1 }; var item3 = new DataItem() { ID = 1, Name = "First Item", RefItem = item2 }; item1.RefItem = item3; Console.WriteLine(Checker.Check(item1)); item1.RefItem = null; Console.WriteLine(Checker.Check(item1)); //Sample how to check all existing items Console.WriteLine(Checker.ValidateDataItems(new List<DataItem>{item1, item2, item3}) ? "items is OK" : "One or more items have dependency"); } 功能。每个项目都传递给函数,函数的返回值用于比较项目而不是原始值。

<input type="search" name="searchtext" ng-model="$parent.searchtext" placeholder="Search"> 

filterstr.isdigit用于提取数字:

key
    Python 2.x 中不需要
  • >>> my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg'] >>> my_list.sort(key=lambda x: int(''.join(filter(str.isdigit, x)))) >>> my_list ['image1.jpg', 'image2.jpg', 'image101.jpg']

答案 1 :(得分:7)

使用正则表达式从字符串中提取数字并转换为int:

import  re
r = re.compile("\d+")
l = my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']
l.sort(key=lambda x: int(r.search(x).group()))

或者可以使用更具体的正则表达式,包括.

import  re

r = re.compile("(\d+)\.")
l = my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']
l.sort(key=lambda x: int(r.search(x).group()))

两者都为您的示例输入提供相同的输出:

['image1.jpg', 'image2.jpg', 'image101.jpg']

如果您确定扩展名,可以使用非常具体的正则表达式:

 r = re.compile("(\d+)\.jpg$")
 l.sort(key=lambda x: int(r.search(x).group(1)))

答案 2 :(得分:4)

实际上你并不需要任何regex模式。你可以像这样轻松解析。

>>> 'image101.jpg'[5:-4]
'101'

解决方案:

>>> sorted(my_list, key=lambda x: int(x[5:-4]))
['image1.jpg', 'image2.jpg', 'image101.jpg']

答案 3 :(得分:3)

如果你想在一般情况下这样做,我会尝试一个像natsort这样的自然排序包。

from natsort import natsorted
my_list = ['image101.jpg', 'image2.jpg', 'image1.jpg']
natsorted(my_list)

返回:

['image1.jpg', 'image2.jpg', 'image101.jpg']

您可以使用pip pip install natsort

进行安装