例如我有清单
my_list= ['image101.jpg', 'image2.jpg', 'image1.jpg']
和
my_list.sort()
给了我
['image1.jpg', 'image101.jpg', 'image2.jpg']
但我当然需要
['image1.jpg', 'image2.jpg', 'image101.jpg']
怎么做?
答案 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">
filter
,str.isdigit
用于提取数字:
key
>>> 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