python中sort函数的具体实现,python中sort和sorted的用法
在学习python的过程中,感觉python中的排序阶段类似于C中的泛型算法,但比C中的更简单易用。
python中list的内置函数sort()可以对list中的元素进行排序,而全局sorted()函数适用于所有迭代序列;而且sort()函数是内置函数,会改变当前对象,而sorted()函数只会返回当前对象的一个排序后的副本,而不会改变当前对象。
1.内置函数sort()
原型:排序(有趣,关键,反向=假)
参数fun表示这个排序函数基于哪种算法。一般情况下,python默认使用归并排序,一般情况下,我们不会重写这个参数,所以基本可以忽略;
key参数用于指定一个函数,每次比较元素时都会调用该函数。这个函数代表排序规则,也就是你根据什么规则对你的序列进行排序;
参数reverse用于表示是否处于相反的顺序。默认情况下,它按升序排序。当reverse=True时,将按降序排序。
下面是一个简单的例子:
(由于个人喜好,我的编译器是pycharm,所以下面的例子都可以在pycharm中运行。)
#编码:8从运算符导入attrgetter,ItemGeterlist 1=[(2, Huan ,23),(12, the ,14),(23, Liu ,90)] #用默认参数排序,即list1.sort()打印list1#按元组中第一个元素排序。输出结果为[(2,欢,23),(12, The ,14),(23,刘,90)] #用匿名表达式重写key表示的函数,按元组list的第二个元素排序1 . Sort(key=lambda x:(x[1]))print list 1 #[(2,欢,23),(23,刘,90),(12, the ,14)] #用匿名表达式重写key按元组list的第三个元素排序1 . Sort(key=lambda x:(x[2]))print list 90)] #用匿名函数重写键#如果下标2的元素相同,就按下标0的元素排序。 清单1。Sort (key=lambda x: (x [2],x [0]))打印列表1 # [(12, the ,14),(2, Huan ,23),(23, 90)]#使用运算符模块中的itemgetter函数重写key表示的函数,按照下标为1的元素进行排序。清单1。Sort (key=itemgetter (1))打印列表1 # [(2,欢,23),(23,刘,90),(12, 14)]#使用运算符模块中的itemgetter函数重写key表示的函数,按照下标为2的元素进行排序。清单1。sort(key=item getter(2))Print List 1 #[(12, the ,14),(2, Huan ,23),(23, Li Li 90)]#这里可以比较lambda中的排序方法,就不解释list1.sort (key=itemgetter (2,0)) printlist1 # [(12, the ,14),(2, Huan ,23),(23, Liu ,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)后会返回元组(r[2],r[5],R [3])。(2) attrgetter算子。attrgetter (attr)运算符。attrgetter (* attrs)该函数返回一个操作数中带有attr属性的可调用对象。如果传入了多个属性,则返回包含这些属性的元组。这些属性的名称可以包含多个子名称,例如:f=attrgetter(name ),调用f(b)将返回b.name.f=attrgetter (name , date ),调用f(b)将返回(b.name,B.date)。f=attrgetter (name.first , name.last ),调用f(b)将返回(b.name.first,b.name.last)。
2.全局函数排序()
sorted()函数中键的重写和sort()函数中的重写是一样的,所以刚才在sort()中解释的方法都适用于sorted()函数,下面的解释我就不一一列举了,而下面要解释的键的重写也适用于sort()函数,那么为什么不在sort()函数中再列举一遍呢,为了不
这里还有一个例子:
from运算符导入attrgetterclass数据:article _ name=str()readers=0 def _ _ init _ _(self,TPL):self . article _ name=TPL[0]self . readers=TPL[1]def getKey(self):return self . readers def _ _ str _ _(self):return str(str(self . article _ name)str(:)str(self . readers))list 1=[Data(( Java ,100)),Data( c ,100)),Data( Python ,89)),Data(()list3=sorted(list1,Key=attrgetter (article _ name , readers ) 结果为:C: 90C: 100Java: 100Python: 89 #也可以操作List4=sorted (List1,key=data.getkey) 结果为
对于sorted()函数,还可以使用sort()函数中引入的方法。你可以自己试试。
最后,当然,在上面所有的例子中,我都没有使用reverse参数。对于此参数,它用于控制排序的方向。可以自己试试,这里就不介绍了。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。