文章目录
本文详细介绍列表、字典、集合和元组等数据结构的重新排序方法,并提供实用的代码示例。
1. 列表的重新排序
1.1 使用 sort()
方法
sort()
方法是 Python 列表(list)对象的一个内置方法,用于就地排序,也就是说它会直接修改原列表,不返回任何值。这个方法非常灵活,支持多个参数以适应不同的排序需求。
以下是一个示例,根据字符串的长度进行排序,并设置排序顺序为降序:
words = ['banana', 'apple', 'cherry', 'date']
words.sort(key=len, reverse=True)
print(words)
key=len
: 这指示sort()
方法按照列表中每个字符串的长度进行排序。reverse=True
: 这使排序的顺序为降序,即列表中的元素将从最长到最短排列。
运行上述代码将输出:['banana', 'cherry', 'apple', 'date']
。在这个列表中,字符串根据它们的长度被排序,从最长到最短。
1.2 使用 sorted()
函数
sorted()
函数是Python中的内置函数,它可以对任意可迭代的对象进行排序,并返回一个新的列表,而不改变原始数据。这使得 sorted()
非常适用于那些不支持就地修改的数据类型,如元组或字符串。此外,与 sort()
方法类似,sorted()
函数也支持 key
和 reverse
参数,提供额外的排序功能。
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_numbers = sorted(numbers, key=lambda x: x, reverse=True)
print(sorted_numbers)
key=lambda x: x
: 这里的key
函数简单地返回元素本身,其实在这个例子中,它不会影响排序结果,因为是按元素自身的值排序。这一参数主要用来演示一下,通常会在这里放入更复杂的函数,比如计算或提取元素的特定属性。reverse=True
: 这个参数指定排序应该是降序,即从大到小。
结果解释:
将按照元素值的降序排列 numbers
列表,输出结果为 [9, 6, 5, 5, 5, 4, 3, 3, 2, 1, 1]
。
2. 字典的重新排序
尽管字典(自Python 3.7起)保持插入顺序,但有时我们需要根据键或值来排序字典。
2.1 按键排序
用 sorted()
函数对字典的键进行排序,并使用字典推导式创建一个新的有序字典。
data = {'apple': 10, 'orange': 20, 'banana': 5, 'cherry': 15}
sorted_data = {k: data[k] for k in sorted(data)}
print(sorted_data) # {'apple': 10, 'banana': 5, 'cherry': 15, 'orange': 20}
-
对字典键进行排序:
sorted(data)
通过对字典data
的键进行排序来工作。字典默认进行键的迭代,所以sorted(data)
实质上是将字典的键排序并返回一个列表,这个列表包含了排序后的键(这里是按字母顺序排列的) -
使用字典推导式创建新字典:
{k: data[k] for k in sorted(data)}
是一个字典推导式,它遍历sorted(data)
返回的排序后的键列表。对于每个键k
,字典推导式从原始字典data
中提取对应的值data[k]
,然后以键值对(k, data[k])
的形式在新字典中创建条目。
2.2 按值排序
同样使用 sorted()
函数,但是通过指定排序的关键字参数。
data = {'apple': 10, 'orange': 20, 'banana': 5, 'cherry': 15}
sorted_data = {k: v for k, v in sorted(data.items(), key=lambda item: item[1])}
print(sorted_data) # {'banana': 5, 'cherry': 15, 'apple': 10, 'orange': 20}
lambda
函数指定了排序应该依据字典的值进行。
-
使用
sorted()
函数对字典按值排序:- 在
sorted()
函数中,使用data.items()
获取字典的键值对视图,它返回一个包含字典所有项(键和值对)的视图对象。 key=lambda item: item[1]
指定了排序的依据,其中lambda
函数接受每个字典项(item
),并返回项中的第二个元素(即值)。
- 在
-
字典推导式创建新的有序字典:
{k: v for k, v in sorted(data.items(), key=lambda item: item[1])}
是一个字典推导式,遍历由sorted()
函数返回的已按值排序的键值对列表。对于列表中的每个键值对k, v
,字典推导式将它们重新组合为一个新的键值对,并在新字典中创建相应的条目。
3. 集合的排序问题
集合(set)是一个无序的集合类型,不支持基于索引的访问,这意味着集合本身不能直接进行排序操作。但是可以通过将集合转换为列表,然后对列表进行排序,从而实现对集合中元素的排序。
fruits = {'apple', 'orange', 'banana', 'cherry'}
sorted_fruits = sorted(fruits)
print(sorted_fruits) # ['apple', 'banana', 'cherry', 'orange']
先将集合转换成列表,然后排序。排序后的结果是一个列表。
-
转换为列表:
使用
sorted()
函数时,首先会将集合fruits
转换为列表。sorted()
函数能够接受任意的可迭代对象,包括集合,并返回一个新的、排序后的列表。 -
排序操作:
sorted()
函数默认按照元素的自然顺序(对于字符串是字典序)对列表进行排序。在这个例子中,集合中的字符串元素被按照字母顺序排列。
4. 元组的重新排序
元组(tuple)是一种不可变的序列类型,这意味着一旦元组被创建,它的内容就不能被修改,包括不能添加或删除元素,也不能对元素进行排序。但可以使用 sorted()
函数将元组转换为一个排序后的列表。
numbers = (3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5)
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9] 结果是一个新的列表
与集合类似,元组中的数字被排序并返回为一个新的列表,列表中的元素按从小到大的顺序排列。
推荐我的相关专栏: python 错误记录