list排序sort(list排序方法根据某个字段排序)
python中list.sort()的用
只要是可迭代对象都可以用sorted 。
sorted(itrearble, cmp=None, key=None, reverse=False)
=号后面是默认值 默认是升序排序的, 如果想让结果降序排列,用reverse=True
最后会将排序的结果放到一个新的列表中, 而不是对iterable本身进行修改。
eg:
1, 简单排序
sorted('123456') 字符串
['1', '2', '3', '4', '5', '6']
sorted([1,4,5,2,3,6]) 列表
[1, 2, 3, 4, 5, 6]
sorted({1:'q',3:'c',2:'g'}) 字典, 默认对字典的键进行排序
[1, 2, 3]
sorted({1:'q',3:'c',2:'g'}.keys()) 对字典的键
[1, 2, 3]
sorted({1:'q',3:'c',2:'g'}.values()) 对字典的值
['c', 'g', 'q']
sorted({1:'q',3:'c',2:'g'}.items()) 对键值对组成的元组的列表
[(1, 'q'), (2, 'g'), (3, 'c')]
2, 对元素指定的某一部分进行排序,关键字排序
s = ['Chr1-10.txt','Chr1-1.txt','Chr1-2.txt','Chr1-14.txt','Chr1-3.txt','Chr1-20.txt','Chr1-5.txt']
我想要按照-后的数字的大小升序排序。要用到key
sorted(s, key=lambda d : int(d.split('-')[-1].split('.')[0]))
['Chr1-1.txt', 'Chr1-2.txt', 'Chr1-3.txt', 'Chr1-5.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-20.txt']
这就是key的功能,制定排序的关键字,通常都是一个lambda函数,当然你也可以事先定义好这个函数。如果不讲这个关键字转化为整型,结果是这样的:
sorted(s, key=lambda d : d.split('-')[-1].split('.')[0])
['Chr1-1.txt', 'Chr1-10.txt', 'Chr1-14.txt', 'Chr1-2.txt', 'Chr1-20.txt', 'Chr1-3.txt', 'Chr1-5.txt']
这相当于把这个关键字当做字符串了,很显然,在python中,'2' '10'
你可以定制你想要的key, 如 key = lambda x : len(x) 按照序列的长度去排序。key= lambda x : (x[1], x[0]) 按二个元素,再第一个 等等。。。
java 怎么将List里面数据排序?
学生实体类,包含姓名和年龄属性,
比较时先按姓名升序排序,如果姓名相同则按年龄升序排序。
第一种:实体类自己实现比较
(实现comparable接口:public interface ComparableT ,里面就一个方法声明:public int compareTo(T o); )
然后利用List类的sort(Comparator? super E c)方法或java.util.Collections工具类的sort(ListT list) (其实里面就一句:list.sort(null); )进行排序:
结果:
第二种:借助比较器进行排序。
示例代码:
比较器java.util.Comparator类是一个接口(public interface ComparatorT ),包含int compare(T o1, T o2);等方法:
我们的比较器要实现该接口并实现compare方法:
比较的时候可以利用List的sort(Comparator? super E c)方法(或者java.util.Collections工具类的sort(ListT list, Comparator? super T c)方法)进行排序。
结果跟第一种方法一样:
sort、sorted排序技巧(多级排序)
Python list内置sort()方法用来排序,也可以用python内置的全局sorted()方法来对可迭代的序列排序生成新的序列。
示例:
1)排序基础
简单的升序排序是非常容易的。只需要调用sorted()方法。它返回一个新的list,新的list的元素基于小于运算符( lt )来排序。
你也可以使用list.sort()方法来排序,此时list本身将被修改。通常此方法不如sorted()方便,但是如果你不需要保留原来的list,此方法将更有效。
另一个不同就是list.sort()方法仅被定义在list中,相反地sorted()方法对所有的可迭代序列都有效。
2)key参数/函数
从python2.4开始,list.sort()和sorted()函数增加了key参数来指定一个函数,此函数将在每个元素比较前被调用。 例如通过key指定的函数来忽略字符串的大小写:
key参数的值为一个函数,此函数只有一个参数且返回一个值用来进行比较。这个技术是快速的因为key指定的函数将准确地对每个元素调用。
更广泛的使用情况是用复杂对象的某些值来对复杂对象的序列排序,例如:
同样的技术对拥有命名属性的复杂对象也适用,例如:
3)Operator 模块函数(多级排序)
上面的key参数的使用非常广泛,因此python提供了一些方便的函数来使得访问方法更加容易和快速。operator模块有itemgetter,attrgetter,从2.6开始还增加了methodcaller方法。使用这些方法,上面的操作将变得更加简洁和快速:
operator模块还允许多级的排序,例如,先以grade,然后再以age来排序:
4)升序和降序
list.sort()和sorted()都接受一个参数reverse(True or False)来表示降序或升序排序。
例如对上面的student降序排序如下:
5)排序的稳定性和复杂排序
从python2.2开始,排序被保证为稳定的。意思是说多个元素如果有相同的key,则排序前后他们的先后顺序不变。
注意在排序后'blue'的顺序被保持了,即'blue', 1在'blue', 2的前面。
更复杂地你可以构建多个步骤来进行更复杂的排序,例如对student数据先以grade降序排列,然后再以age升序排列。
c# list sort多条件排序
class?Data?{?public?int?aa;?public?int?bb;?public?int?cc;?}
static?void?Main()
{
????ListData?list?=?new?ListData();
????list.Sort((a,?b)?=
????????a.aa?!=?b.aa???a.aa.CompareTo(b.aa)?:
????????a.bb?!=?b.bb???a.bb.CompareTo(b.bb)?:
????????a.cc.CompareTo(b.cc)
????);
}
Java List提供的默认排序方法sort()用的是什么排序策略?
你好,很高兴回答你的问题。
List只是个接口,sort方法具体是怎么排序的是在具体的实现类中的。
不同的实现类排序实现是不一样的。有的同一个实现类在java的不同版本中排序的实现也可能是有差别的。
如果有帮助到你,请点击采纳。
c#如何对list进行排序
第一种:实体类实现IComparable接口,而且必须实现CompareTo方法
class Info:IComparable
{
public int Id { get; set; }
public string Name { get; set; }
public int CompareTo(object obj) {
int result;
try
{
Info info = obj as Info;
if (this.Id info.Id)
{
result = 0;
}
else
result = 1;
return result;
}
catch (Exception ex) { throw new Exception(ex.Message); }
}
}
调用方式如下,只需要用sort方法就能实现对list进行排序。
private static void ReadAccordingCompare() {
ListInfo infoList = new ListInfo();
infoList.Add(
new Info() { Id = 1, Name = "abc" });
infoList.Add(new Info() { Id = 3, Name = "rose" });
infoList.Add(new Info() { Id = 2, Name = "woft" });
infoList.Sort();
foreach (var item in infoList)
{
Console.WriteLine(item.Id + ":" + item.Name);
}
}
第二种方法:linq to list进行排序
运用linq实现对list排序,在实体类定义的时候就不需用实现IComparable接口,调用方式如下:
private static void ReadT(string str) {
ListInfo infoList = new ListInfo();
infoList.Add(
new Info() { Id = 1, Name = "woft" });
infoList.Add(new Info() { Id=3,Name="rose"});
infoList.Add(new Info() { Id = 2, Name = "abc" });
Console.WriteLine("ReadT*********************");
IEnumerableInfo query = null;
query = from items in infoList orderby items.Id select items;
foreach (var item in query)
{
Console.WriteLine(item.Id+":"+item.Name);
}
}
但是上面两种方式都只能对一个实体属性排序,如果对不同的属性排序的话只能写很多的if进行判断,这样显得很麻烦。且看下面的方式实现根据传入参数进行排序。
private static void ListSort(string field,string rule)
{
if (!string.IsNullOrEmpty(rule)(!rule.ToLower().Equals("desc")||!rule.ToLower().Equals("asc")))
{
try
{
ListInfo infoList = GetList();
infoList.Sort(
delegate(Info info1, Info info2)
{
Type t1 = info1.GetType();
Type t2 = info2.GetType();
PropertyInfo pro1 = t1.GetProperty(field);
PropertyInfo pro2 = t2.GetProperty(field);
return rule.ToLower().Equals("asc") ?
pro1.GetValue(info1, null).ToString().CompareTo(pro2.GetValue(info2, null).ToString()) :
pro2.GetValue(info2, null).ToString().CompareTo(pro1.GetValue(info1, null).ToString());
});
Console.WriteLine("*****ListSort**********");
foreach (var item in infoList)
{
Console.WriteLine(item.Id + "," + item.Name);
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
} Console.WriteLine("ruls is wrong");
}
调用方式:
ListSort("Name","desc");//表示对Name进行desc排序
ListSort("Id","asc");//表示对Id进行asc排序。如此如果参数很多的话减少了很多判断。