Python中的sort函数,sort和sorted函数python
在学习python的过程中,感觉python中的排序阶段类似于C中的泛型算法,但比C中的更简单易用。
python中list的内置函数sort()可以对list中的元素进行排序,而全局sorted()函数适用于所有迭代序列;而且sort()函数是内置函数,会改变当前对象,而sorted()函数只会返回当前对象的一个排序后的副本,而不会改变当前对象。
1.内置函数sort()
原型:排序(有趣,关键,反向=假)
参数fun表示这个排序函数基于哪种算法。一般情况下,python默认使用归并排序,一般情况下,我们不会重写这个参数,所以基本可以忽略;
key参数用于指定一个函数,每次比较元素时都会调用该函数。这个函数代表排序规则,也就是你根据什么规则对你的序列进行排序;
参数reverse用于表示是否处于相反的顺序。默认情况下,它按升序排序。当reverse=True时,将按降序排序。
下面是一个简单的例子:
(由于个人喜好,我的编译器是pycharm,所以下面的例子都可以在pycharm中运行。)
#编码:utf-8
从运算符导入attrgetter,itemgetter
list1=[(2,《桓》,23),(12,《经》,14),(23,《刘》,90)]
#按默认参数排序,即按元组中的第一个元素排序
list1.sort()
打印列表1
#输出结果为[(2,桓,23),(12,本,14),(23,刘,90)]
#用匿名表达式重写key表示的函数,按tuple的第二个元素排序。
list1.sort(key=lambda x:(x[1]))
打印列表1
#[(2,桓,23),(23,刘,90),(12,本,14)]
#用匿名表达式重写key表示的函数,按照元组的第三个元素排序。
list1.sort(key=lambda x:(x[2]))
打印列表1
#[(12,著,14),(2,桓,23),(23,刘,90)]
#用匿名函数重写key表示的函数,先按照元组中下标2排序,
#如果下标2处的元素相同,则按下标0处的元素排序。
list1.sort(key=lambda x:(x[2],x[0]))
打印列表1
#[(12,著,14),(2,桓,23),(23,刘,90)]
#使用运算符模块中的itemgetter函数重写key表示的函数,按照下标为1的元素排序。
list1.sort(key=itemgetter(1))
打印列表1
#[(2,桓,23),(23,刘,90),(12,本,14)]
#使用运算符模块中的itemgetter函数重写key表示的函数,按照下标为2的元素排序。
list1.sort(key=itemgetter(2))
打印列表1
# [(12,著,14),(2,桓,23),(23,刘,90)]
# lambda中的排序方法在这里可以类比,不再赘述。
list1.sort(key=itemgetter(2,0))
打印列表1
#[(12,著,14),(2,桓,23),(23,刘,90)]
如果你不知道上面的匿名功能,可以自己去了解一下,这里就不展开了。
这里我想解释一下算子模块中的两个函数:
(1)itemgetter
operator . item getter(item)operator . item getter(* items)这个函数会调用传入操作数的__getitem__()方法返回一个带有item的可调用对象,如果传入的参数是多个,则返回一个tuple类型的可调用对象。比如:f=itemgetter(2),调用f(r)后会返回r[2]g=itemgetter(2,5,3),调用g(r)后会返回tuple (r[2),
R [5],R [3])。(2) Attrgetteroperator。Attrgetter (attr)运算符。Attrgetter (* attrs)该函数返回一个操作数中带有attr属性的可调用对象。如果传入了多个属性,则返回包含这些属性的元组。这些属性的名称可以包含多个子名称,例如:f=
Attrgetter(name ),调用f(b)将返回b.name.f=
Attrgetter(name , date ),调用f(b)将返回(b.name,
b .日期)。f=
Attrgetter (name.first , name.last ),调用f(b)将返回(b.name.first,
b.name.last)。
2.全局函数排序()
sorted()函数中键的重写和sort()函数中的重写是一样的,所以刚才在sort()中解释的方法都适用于sorted()函数,下面的解释我就不一一列举了,而下面要解释的键的重写也适用于sort()函数,那么为什么不在sort()函数中再列举一遍呢,为了不
这里还有一个例子:
从操作员导入attrgetter
类别数据:
article_name=str()
读者=0
def __init__(self,tpl):
self.article_name=tpl[0]
self.readers=tpl[1]
def getKey(self):
回归自我.读者
def __str__(self):
return str(str(self . article _ name)str(:)str(self . readers))
list 1=[数据(( java ,100)),数据(( c ,100),数据(( python ,89),数据(( c ,90))]
#在这里调用attrgetter函数按读者排序。
list2=已排序(list1,key=attrgetter(readers ))
“”的结果是
python:89
丙:90
java:100
列车员:100元
#这里list1先按article_name排序,同名的按读者排序。
list3=sorted(list1,key=attrgetter(article_name , readers ))
结果是:
丙:90
列车员:100元
java:100
python:89
#使用类中的自定义函数也可以操作。
list4=已排序(list1,key=Data.getKey)
结果是:
python:89
丙:90
java:100
列车员:100元
上面例子的结果都打印出来了。
对于sorted()函数,还可以使用sort()函数中引入的方法。你可以自己试试。
最后,当然,在上面所有的例子中,我都没有使用reverse参数。对于此参数,它用于控制排序的方向。可以自己试试,这里就不介绍了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。