python排序函数

python 基础的排序函数 sort 、sorted 、argsort

一、sort 、sorted

1.简单升序排序直接调用sorted函数即可

sort()方法仅定义在list中

ls = list([5, 2, 3, 1, 4])
ls.sort()
print ls
>>>[1, 2, 3, 4, 5]

sorted()方法对所有的可迭代序列都有效,返回list

l1 = ['b','c','d','b','c','a','a'] 
sorted(set(l1),key=l1.index) 
Out[31]: ['b', 'c', 'd', 'a']

print(sorted({8: 'D', 2: 'B', 3: 'B', 4: 'E', 5: 'A'}))
>>>[2, 3, 4, 5, 8]

2.sorted(iterable,cmp,key,reverse)

(1) 使用cmp函数排序,cmp是带两个参数的比较函数

>>>L = [('david', 90), ('mary',90), ('sara',80),('lily',95)]

>>>print(sorted(L,cmp = lambda x,y: >>>cmp(x[0],y[0])))#按照第一个位置的字母序排序
[('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]

>>>print(sorted(L,cmp = lambda x,y: >>>cmp(x[1],y[1])))#按照第二个位置的数字序排序
[('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]

(2) 添加key参数,key 是带一个参数的函数
list.sort()和sorted()函数使用key参数来指定一个函数,此函数将在每个元素比较前被调用。

# 通过key指定的函数来忽略字符串的大小写
>>>print(sorted("This is a test string from Andrew".split(), key=str.lower))
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

# 通过key指定的函数来保持原序列顺序
>>>l1 = ['b','c','d','b','c','a','a'] 
>>>sorted(set(l1),key=l1.index) 
Out[31]: ['b', 'c', 'd', 'a']

(3) reverse

>>>L = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
>>>print(sorted(L, reverse=True))  # 逆转
[('sara', 80), ('mary', 90), ('lily', 95), ('david', 90)]
二、argsort

argsort 是 numpy 库中的函数。返回数组值从小到大的索引值。

# 一维数组
>>>x = np.array([5, 4, 2])
>>>np.argsort(x)
Out[45]: array([2, 1, 0])

# 二维数组
>>>x = np.array([[0, 3], [2, 2]])
array([[0, 3],
       [2, 2]])
>>>np.argsort(x, axis=0) #按列排序
Out[48]: 
array([[0, 1],
       [1, 0]])
>>>np.argsort(x, axis=1) #按行排序
Out[51]: 
array([[0, 1],
       [0, 1]])
>>> x = np.array([3, 1, 2])
>>> np.argsort(x) #按升序排列
array([1, 2, 0])
>>> np.argsort(-x) #按降序排列
array([0, 2, 1])
>>> x[np.argsort(x)] #通过索引值排序后的数组
array([1, 2, 3])
>>> x[np.argsort(-x)]
array([3, 2, 1])
<think>好的,我现在需要回答用户关于Python排序函数用法的问题,并且提供示例。首先,我需要回忆Python中常用的排序方法,比如内置的sorted()函数和列表的sort()方法。这两者的区别在于sorted()返回新列表,而sort()原地排序,这可能是一个需要注意的点。 接下来,我应该给出基本示例,比如对数字列表进行升序和降序排序。用户可能需要知道如何通过reverse参数控制排序顺序。此外,使用key参数进行自定义排序也是很重要的部分,比如对字符串按长度排序,或者对字典按特定键排序。 然后,高级用法部分可能需要涉及lambda函数作为key参数,这在处理复杂数据结构时非常有用。比如按照元组的第二个元素排序,或者对对象列表根据属性排序。这里可以引用站内的引用[1],提到lambda函数在数据处理中的应用,例如与pandas的map()函数结合使用,虽然示例中可能不涉及pandas,但可以说明lambda的通用性。 另外,用户可能想知道如何稳定排序,或者处理无法直接比较的元素,这时候可能需要使用到functools.cmp_to_key,这部分虽然不常用,但值得提及。 然后,我需要考虑生成相关的问题,比如如何自定义排序规则、多条件排序、处理大型数据集时的效率问题,或者不同排序算法的应用场景。例如,快速排序和归并排序的区别,或者Timsort的特点,这些可以作为相关问题提出。 在检查过程中,要确保所有数学表达式都用$...$格式,比如在说明排序算法的时间复杂度时,比如$O(n \log n)$。如果有独立公式,需要用$$...$$,但可能在排序函数的回答中涉及较少,但如果有的话需要注意格式。 最后,确保引用正确,比如在提到lambda函数时添加引用标识[^1],可能还需要检查是否有其他需要引用的地方,比如内部函数调用如引用[2],但当前问题可能不涉及,所以可能只引用到第一个。 现在需要组织内容,确保结构清晰,分点说明,并附上代码示例。同时,检查LaTeX语法是否正确,比如时间复杂度的正确表示,以及使用中文回答。完成后,生成三个相关问题,帮助用户进一步学习。</think>### Python排序函数用法详解 Python提供了多种排序方法,主要分为**内置函数**和**自定义排序规则**两类。以下是具体用法和示例: --- #### 一、基础排序方法 1. **`sorted()`函数** 返回新排序列表,原数据不变: ```python nums = [3, 1, 4, 1, 5, 9] sorted_nums = sorted(nums) # 升序:[1, 1, 3, 4, 5, 9] reverse_sorted = sorted(nums, reverse=True) # 降序:[9, 5, 4, 3, 1, 1] ``` 2. **`list.sort()`方法** 原地修改列表,无返回值: ```python nums = [3, 1, 4, 1, 5, 9] nums.sort() # 原列表变为[1, 1, 3, 4, 5, 9] ``` --- #### 二、自定义排序规则 通过`key`参数指定排序依据,时间复杂度为$O(n \log n)$: 1. **按字符串长度排序** ```python words = ["apple", "kiwi", "banana"] sorted_words = sorted(words, key=lambda x: len(x)) # ["kiwi", "apple", "banana"] ``` 2. **按字典键值排序** ```python students = [{"name": "Alice", "age": 25}, {"name": "Bob", "age": 20}] sorted_students = sorted(students, key=lambda x: x["age"]) # Bob在前,Alice在后 ``` 3. **多条件排序** ```python data = [(2, 3), (1, 2), (1, 1)] sorted_data = sorted(data, key=lambda x: (x[0], -x[1])) # 先按第一元素升序,再按第二元素降序 ``` --- #### 三、高级用法 1. **`cmp_to_key`(Python 3兼容)** 需要导入`functools`,用于旧式比较函数: ```python import functools def compare(a, b): return a % 3 - b % 3 # 按模3结果排序 sorted_nums = sorted([7, 2, 5], key=functools.cmp_to_key(compare)) # [5, 7, 2] ``` 2. **对象属性排序** ```python class Person: def __init__(self, name, age): self.name = name self.age = age people = [Person("Tom", 30), Person("Ann", 25)] sorted_people = sorted(people, key=lambda p: p.age) ``` --- #### 四、性能与应用场景 - **内置排序算法**:Python的`sorted()`使用Timsort算法,结合了归并排序和插入排序的优势,时间复杂度为$O(n \log n)$。 - **稳定性**:当元素相同时,保持原有顺序,这对多条件排序非常关键。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值