sort 和 sorted

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_27643275/article/details/88767904

1、基础知识

sort 与 sorted 区别:
1、sort 是应用在 list 上的方法,sorted 可以对所有iterable进行排序操作。
2、list 的 sort 方法返回的是对原来的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

list.sort(cmp=None, key=None, reverse=False)
reverse – 排序规则,reverse = True 降序, reverse = False 升序(默认)

sorted(iterable, /, *, key=None, reverse=False)

key和cmp的区别:

key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

注意:python3删掉了cmp参数。

2、示例

列表排序

random = [(2, 2), (3, 4), (4, 1), (1, 3)]
# 指定按第二个元素以降序排序
random.sort(key=lambda x:x[1],reverse=True)

字典排序

items()可以把字典中的键值对转化成一个列表,其中每个元素是一个tuple

sorted+lambda

# 字典
a = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
b = a.items()
# [('Tuffy', 2), ('Spike', 10), ('Tom', 8), ('Tyke', 3), ('Jerry', 7)]

# 根据key值进行排序
key_result = sorted(a.items(), key=lambda x: x[0])
# [('Bob', 75), ('Michael', 95), ('Tracy', 85)]

# 根据value值进行排序
value_result = sorted(a.items(), key=lambda x: x[1])
# [('Bob', 75), ('Tracy', 85), ('Michael', 95)]

sorted+itemgetter

from operator import itemgetter
c = sorted(a.items(), key=itemgetter(1))
# [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]
d = sorted(a.iteritems(), key=itemgetter(1))
# [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]
e = sorted(a)
# 只对键排序,['Jerry', 'Spike', 'Tom', 'Tuffy', 'Tyke']

3、引申

cmp_to_key

Python3把sort和sorted的cmp参数取消了,想要使用多个参数时,可以使用cmp_to_key

from functools import cmp_to_key

nums = [1, 3, 2, 4]
nums.sort(key=cmp_to_key(lambda a, b: a - b))
print(nums)  # [1, 2, 3, 4]

自定义比较器

把数组排成最小的数

class comparator(str):
    def __lt__(x, y):
        return x + y < y + x

class Solution:
    def PrintMinNumber(self, nums):
        if not nums:
            return ''
        largest_num = ''.join(sorted(map(str, nums), key=comparator))
        # 如果数组里面几个数全是0,比如[0,0,0,0], 那么组成最小的数依然还是0,不能输出0000
        return '0' if largest_num[0] == '0' else largest_num

class FirstList(list):
    def __lt__(self, other):
        return self[0] < other[0]

lst = [ ['a', 3], ['b', 1] ]

lst = [FirstList(item) for item in lst]


更多参考:
https://wiki.python.org/moin/HowTo/Sorting#The_Old_Way_Using_the_cmp_Parameter

https://docs.python.org/3.8/library/functools.html?highlight=cmp_to_key#functools.cmp_to_key

猜你喜欢

转载自blog.csdn.net/baidu_27643275/article/details/88767904