您当前的位置: 首页 >  Python

彭世瑜

暂无认证

  • 1浏览

    0关注

    2791博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Python编程:列表List.sort和sorted方法排序

彭世瑜 发布时间:2021-01-14 15:46:49 ,浏览量:1

排序方法

2.x的代码移植到3.x时,需要将cmp函数转化为key函数

# Python2
list.sort(cmp=None, key=None, reverse=False)

# Python3
list.sort(key=None, reverse=False)

排序有两个方法

list.sort()   # list本身将被修改, 返回None
sorted()      # 不修改原来的list, 返回一个新的list
排序示例

1、list.sort示例

lst = [3, 2, 1]
print(lst)  # [3, 2, 1]

ret = lst.sort()
print(ret)  # None
print(lst)  # [1, 2, 3]

2、sorted示例

lst = [3, 2, 1]
print(lst)  # [3, 2, 1]

ret = sorted(lst)
print(ret)  # [1, 2, 3]
print(lst)  # [3, 2, 1]

看一个实际需求

有一个人员列表,需要按给定需求排序

from pprint import pprint

# name:姓名
# money:钱
# age:年龄
lst = [
    {
        'name': 'Tom',
        'age': 20,
        'money': 2000
    },
    {
        'name': 'Jack',
        'age': 25,
        'money': 2000
    },
    {
        'name': 'Alice',
        'age': 25,
        'money': 3000
    },
    {
        'name': 'Steve',
        'age': 25,
        'money': 3000
    }
]

# 未排序前
pprint(lst)
"""
[{'age': 20, 'money': 2000, 'name': 'Tom'},
 {'age': 25, 'money': 2000, 'name': 'Jack'},
 {'age': 25, 'money': 3000, 'name': 'Alice'},
 {'age': 25, 'money': 3000, 'name': 'Steve'}]
"""

1、需求一:单字段排序,钱多的在前

(1)使用lambda 表达式

# 默认从小到大,reverse=True可以逆序排列
lst.sort(key=lambda item: item['money'], reverse=True)
pprint(lst)
"""
[{'age': 25, 'money': 3000, 'name': 'Alice'},
 {'age': 25, 'money': 3000, 'name': 'Steve'},
 {'age': 20, 'money': 2000, 'name': 'Tom'},
 {'age': 25, 'money': 2000, 'name': 'Jack'}]
"""

(2)使用operator.itemgetter 替换 lambda 表达式

from operator import itemgetter

lst.sort(key=itemgetter('money'), reverse=True)
pprint(lst)

"""
[{'age': 25, 'money': 3000, 'name': 'Alice'},
 {'age': 25, 'money': 3000, 'name': 'Steve'},
 {'age': 20, 'money': 2000, 'name': 'Tom'},
 {'age': 25, 'money': 2000, 'name': 'Jack'}]
"""

(3)使用sorted

from operator import itemgetter

lst2 = sorted(lst, key=itemgetter('money'), reverse=True)
pprint(lst2)

"""
[{'age': 25, 'money': 3000, 'name': 'Alice'},
 {'age': 25, 'money': 3000, 'name': 'Steve'},
 {'age': 20, 'money': 2000, 'name': 'Tom'},
 {'age': 25, 'money': 2000, 'name': 'Jack'}]
"""

以上三种方式排序结果都一样

2、需求二:多字段排序

需要满足3个排序要求

  • 钱money 多的在前面
  • 如果钱money 一样多,年龄age 大的在前
  • 如果钱money 和年龄age 都一样,按照名字首字母顺序排序Z-A排序

如果有一个排序函数就很容易解决

(1) 方式一: 自定义一个排序函数

from functools import cmp_to_key

# 自定义一个排序函数
def foo(a, b):
    if a['money'] > b['money']:
        return 1
    elif a['money']  b['age']:
            return 1
        elif a['age']             
关注
打赏
1665367115
查看更多评论
0.1778s