python list sort学习


前言

刷题的时候遇到要对一个列表里第一个元素升序,在第一个元素相同的时候降序的操作。
python应该有简单的方法所以顺便总结一下python list 里的sort

1. 基本排序

在python中有两种排序方法

  1. sorted(iterable, cmp=None, key=None, reverse=False)
    iterable – 可迭代对象。
    key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
    reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
  2. list.sort(cmp=None, key=None, reverse=False)

简单的升序排序非常简单:只需调用 sorted() 函数。它返回一个新的排序后列表
你也可以使用 list.sort() 方法,它会直接修改原列表(并返回 None 以避免混淆),通常来说它不如 sorted() 方便 ——— 但如果你不需要原列表,它会更有效率。

a = [2,5,3,4,6,8,5]
print('sorted a is: ',sorted(a))
# sorted a is:  [2, 3, 4, 5, 5, 6, 8]
a.sort()
print('sorted a is: ',a)
# sorted a is:  [2, 3, 4, 5, 5, 6, 8]

2. 使用key排序

students = [(‘jane’,‘B’, 16), (‘dave’,‘A’, 14), (‘Amy’, ‘C’, 15), (‘john’,‘A’, 15), (‘Bob’, ‘B’, 14),]

按成绩排序

key = lambda x: x[1]

students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
sorted(students, key = lambda x: x[1]) 
students.sort(key = lambda x: x[1])
print(students)
# [('dave', 'A', 14), ('john', 'A', 15), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]

成绩相同按年龄降序

上面结果中(‘dave’, ‘A’, 14), (‘john’, ‘A’, 15)成绩相同,年龄是升序, 想变成降序

students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
def multisort(s, specs):
    for keyid, reverse in reversed(specs):
        s.sort(key = lambda x: x[keyid], reverse = reverse)
    return s
print(multisort(students, ((1, False),(2, True))))
# [('john', 'A', 15), ('dave', 'A', 14), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]

可以看见结果中前两项发生了反转, 按年龄降序排列了。
注意这里对specs遍历的时候是反向遍历的

还有一种相对简单的写法
如果需要降序的是数字的话可以这样, 因为数字的负数升序就是原数组降序

students = [('jane','B', 16), ('dave','A', 14), ('Amy', 'C', 15), ('john','A', 15), ('Bob', 'B', 14),]
print(sorted(students, key = lambda x: (x[1], -x[2])) )
# [('john', 'A', 15), ('dave', 'A', 14), ('jane', 'B', 16), ('Bob', 'B', 14), ('Amy', 'C', 15)]
### 对Python列表进行排序的方法 在 Python 中,可以通过内置方法 `sort()` 或者函数 `sorted()` 来对列表进行排序。以下是两种方式的具体说明: #### 使用 `list.sort()` 方法 `list.sort()` 是一种原地排序方法,它会直接修改原始列表并按照指定的方式对其进行排序。 ```python nums = [64, 34, 25, 12, 22, 11, 90] nums.sort() print("Sorted numbers using list.sort():", nums) # 输出已排序的列表 [11, 12, 22, 25, 34, 64, 90] [^1] ``` 此方法支持参数设置: - **reverse**: 如果设为 `True`,则按降序排列;默认为 `False` 表示升序排列。 ```python str_list = ['a', 'c', 'd', 'b', 'B', 'C', '1'] str_list.sort(reverse=True) print(str_list) # 输出 ['d', 'c', 'b', 'a', 'C', 'B', '1'] [^2] ``` #### 使用 `sorted()` 函数 `sorted()` 不会对原有列表造成影响,而是返回一个新的排序后的列表副本。 ```python original_nums = [64, 34, 25, 12, 22, 11, 90] sorted_nums = sorted(original_nums) print("Original list remains unchanged:", original_nums) # 原始列表保持不变 [64, 34, 25, 12, 22, 11, 90] print("Newly sorted list:", sorted_nums) # 排序后的新列表 [11, 12, 22, 25, 34, 64, 90] ``` 同样可以传递关键字参数来控制行为: - **key**: 自定义比较逻辑的关键字函数; - **reverse**: 是否反转结果,默认为 False。 ```python words = ["apple", "banana", "cherry", "date"] longest_word_first = sorted(words, key=len, reverse=True) print(longest_word_first) # 按长度从大到小排序:['banana', 'cherry', 'apple', 'date'] ``` 对于更复杂的对象集合(如数据框中的列),也可以通过自定义键来进行多维度排序[^3]。 另外需要注意的是不同算法可能具有不同的时间与空间效率特性,在某些特定场景下需考虑这些因素比如当输入规模较大或者内存受限时可选用堆排序或计数排序等替代方案[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值