sort()应该是list.sort()是一个仅用在list结构中的函数,sorted()是一个内置函数,可以对任何可迭代的对象进行排序操作,并且不会改变原结构,产生新排序后的结果。
list.sort()
list.sort(key=(比较的关键字),reverse=False(升序,默认) or True (降序) )
sort()函数,从列表中拿出每个元素,按照给出的key来进行比较,最后返回排序结果。
例子1:按照单词长度排序
word = ['time','me','aganist']
word.sort(key = lambda x:len(x))
#从列表中拿出一个单词x,返回他的长度
# word.sort() ##最原始的就是按照单词顺序排序
print(word) #-> ['me', 'time', 'aganist']
例子2:按照数字平方大小排序
num = [-1,0,1,4,-9,8]
num.sort(key = lambda x:x**2,reverse = True) #降序
print(num) #->[-9, 8, 4, -1, 1, 0]
sorted()
sorted(iterable(可迭代对象),key,reverse )
sorted()函数,从可迭代对象中拿出每个元素,按照给出的key来进行比较,最后返回排序结果。
例子3(列表使用):
word = ['time','me','aganist']
word_1 = sorted(word,key = lambda x:len(x))
print(word_1) #与例1相同结果
例子4,(构造好的词频,统计前频率最高的几个单词):
dic = {'mother':1,'sun':3,'uncle':2,'sister':9}
dic = sorted(dic.items(),key = lambda x:x[1],reverse =True)
### 注意,必须是dic.items(),dic是可迭代对象类型,但dic默认可迭代对象是key
print(dic[:3]) #前三个单词
例子5,列表中不仅是int类型,还有char类型,不可比较时,利用functools.cmp_to_key()。Python2中的sorted 可以指定cmp关键字参数,就是当遇到需要自定义比较操作的数据可以通过 cmp=compare 来实现,不需要像Python3中还需要导入functools.cmp_to_key实现。
import functools
nums = [3, 1.5, 2.5, '6', '2.5']
def compare(x1, x2):
if isinstance(x1, str):
x1 = float(x1)
if isinstance(x2, str):
x2 = float(x2)
return x1 - x2
>>>sorted(nums, key=functools.cmp_to_key(compare))
[1.5, 2.5, '2.5', 3, '6']
例子同样来自上面的链接,说明一下为什么比较结果是这样的。functools.cmp_to_key(),接受两个参数也就是从L中按照一定的顺序拿出两个位置的内容,如3和‘6’。然后带入到compare(自定义)函数中。用定义的方法比较他们,最后返回一个数字。如果是正数,代表大于,负数是小于,0是等于。如果是3和'6'带进去,那么输出的意思就是3大于‘6’。注意是string类型的6。
补一个题:面试题45. 把数组排成最小的数 来自题解:@Krahets
题目是要按照题中所述,总结比较规则,然后按照规则排序。
class Solution:
def minNumber(self, nums: List[int]) -> str:
def sort_rule(x, y): # 比较x,y大小
a, b = x + y, y + x
if a > b: return 1 # x+y >y+x -----> x>y
elif a < b: return -1 ## 小于
else: return 0 ##等于
strs = [str(num) for num in nums]
strs.sort(key = functools.cmp_to_key(sort_rule)) ##比较规则,按照定义的比较规则去排序
return ''.join(strs)
补充一点:sort()函数的时间复杂度是O(NlogN),与内部机制(Timsort)有关,详细介绍点链接。
参考: