python sort怎么用_Python的sort用法以及原理

在python中如果要对list, tuple, dict进行排序,一般会用到sort函数

1. 基本用法

1.1 列表1

2

3

4

5

6x = [4, 6, 2, 3]

y = x.sort()

z = sorted(x)

print(x)

print(y)

print(z)

output:

1

2

3[2,3,4,6]

None

[2,3,4,6]

sort和sorted的原理类似,区别在于sort()是直接对原对象进行排序,没有返回值;而sorted()是新建一个对原对象排序后的新对象,返回新对象1.2 元组

1.2 元组1

2

3

4x = (2, 5, 3, 4)

z = sorted(x)

print(x)

print(z)

output:

1

2(2, 5, 3, 4)

[2, 3, 4, 5]

tuple没有sort()函数,另外值得注意的是,返回的是list,而非tuple

1.3 字典1

2

3x = {"a":2, "c":5, "e":3, "b":4}

z = sorted(x)

print(z)

output:

1['a', 'b', 'c', 'e']

dict没有sort()函数,默认情况下是对字典的键进行排序,并返回排序后的键列表

2. 进阶用法

2.1 key函数1print(sorted("This is a test string from Andrew".split(), key=str.lower))

output:

1['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

key可以接受一个函数,用于指定排序方法

2.2 lambda函数1

2

3

4

5

6student_tuples = [

('john', 'A', 15),

('jane', 'B', 12),

('dave', 'B', 10),

]

print(sorted(student_tuples, key=lambda student: student[2]))

output:

1[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

通过第三个元素进行排序

2.3 类方法1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16class :

def __init__(self, name, grade, age):

self.name = name

self.grade = grade

self.age = age

def __repr__(self):

return repr((self.name, self.grade, self.age))

def weighted_grade(self):

return 'CBA'.index(self.grade) / float(self.age)

student_objects = [

Student('john', 'A', 15),

Student('jane', 'B', 12),

Student('dave', 'B', 10),

]

print(sorted(student_objects, key=lambda student: student.age))

output:

1[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

通过类方法指定key参数

2.4 正序或反序1

2

3

4

5

6student = [

('john', 'A', 15),

('jane', 'B', 12),

('dave', 'B', 10),

]

print(sorted(student, key=lambda x:x[2], reverse=True))

output:

1[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

指定reverse的参数为True则进行反序排列,设为False或者不设则默认为正序排列

3 Operator模组1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29from operator import itemgetter, attrgetter, methodcaller

class :

def __init__(self, name, grade, age):

self.name = name

self.grade = grade

self.age = age

def __repr__(self):

return repr((self.name, self.grade, self.age))

def weighted_grade(self):

return 'CBA'.index(self.grade) / float(self.age)

student_objects = [

Student('john', 'A', 15),

Student('jane', 'B', 12),

Student('dave', 'B', 10),

]

student_tuples = [

('john', 'A', 15),

('jane', 'B', 12),

('dave', 'B', 10),

]

print(sorted(student_tuples, key=itemgetter(2)))

print(sorted(student_objects, key=attrgetter('age')))

print(sorted(student_tuples, key=itemgetter(1,2)))

print(sorted(student_objects, key=attrgetter('grade', 'age')))

print(sorted(student_objects, key=methodcaller('weighted_grade')))

output:

1

2

3

4

5[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

[('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]

[('jane', 'B', 12), ('dave', 'B', 10), ('john', 'A', 15)]

在Operator模组中,有itemgetter, attrgetter以及methodecaller方法

4 sorted()原理

python中的sort()方法使用的是快排。

快速排序分治法思想的一种实现,它的思路是使数组中的每个元素与基准值(Pivot,通常是数组的首个值,A[0])比较,数组中比基准值小的放在基准值的左边,形成左部;大的放在右边,形成右部;接下来将左部和右部分别递归地执行上面的过程:选基准值,小的放在左边,大的放在右边…直到排序结束。

4.1 步骤:找基准值,设Pivot = a[0]

分区(Partition):比基准值小的放左边,大的放右边,基准值(Pivot)放左部与右部的之间。

进行左部(a[0] - a[pivot-1])的递归,以及右部(a[pivot+1] - a[n-1])的递归,重复上述步骤。

4.2 快排源码:1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20class quick_sort(object):

def _partition(self, alist, p, r):

i = p-1

x = alist[r]

for j in range(p, r):

if alist[j] <= x:

i += 1

alist[i], alist[j] = alist[j], alist[i]

alist[i+1], alist[r] = alist[r], alist[i+1]

return i+1

def _quicksort(self, alist, p, r):

if p < r:

q = self._partition(alist, p, r)

self._quicksort(alist, p, q-1)

self._quicksort(alist, q+1, r)

def __call__(self, sort_list):

self._quicksort(sort_list, 0, len(sort_list)-1)

return sort_list

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: sort_values() 是 pandas 库中的一个函数,用于对 DataFrame 或 Series 进行排序。其用法如下: 对于 DataFrame,可以使用 sort_values() 方法,对其中的一列或多列进行排序,其中参数 by 用于指定排序依据的列名或列名列表,参数 ascending 用于指定是否升序排序,参数 inplace 用于指定是否在原 DataFrame 上进行修改。例如,以下代码按照 'col1' 列进行升序排序: ``` df.sort_values(by='col1', ascending=True, inplace=True) ``` 对于 Series,可以使用 sort_values() 方法,对其中的值进行排序,其中参数 ascending 用于指定是否升序排序,参数 inplace 用于指定是否在原 Series 上进行修改。例如,以下代码按照 Series 对象 s 中的值进行降序排序: ``` s.sort_values(ascending=False, inplace=True) ``` 需要注意的是,sort_values() 方法默认返回一个排序后的新对象,而不是在原对象上进行修改,除非设置了参数 inplace=True。 ### 回答2: sort_values是pandas库中的一个排序函数,用于对DataFrame或Series中的数据进行排序操作。具体的用法如下: 1. 对DataFrame排序: DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last') 参数解释: - by:指定按哪个列进行排序,可以是单个列名字符串,也可以是多个列名构成的列表或元组。 - axis:指定按行(axis=0)还是按列(axis=1)排序,默认为0。 - ascending:指定升序(ascending=True)还是降序(ascending=False)排序,默认为True。 - inplace:指定是否在原有的DataFrame上进行修改,默认为False。 - kind:指定排序算法,可以选择快速排序(kind='quicksort')、归并排序(kind='mergesort')或堆排序(kind='heapsort'),默认为快速排序。 - na_position:指定缺失值在排序后的位置,可选的有‘last’和'first',默认为‘last’。 示例: ``` import pandas as pd data = {'name':['Tom', 'Jerry', 'Spike', 'Tyke'], 'age':[9, 7, 3, 1], 'score':[89, 67, 91, 80]} df = pd.DataFrame(data) print(df) # 按age列升序排序 df_sort = df.sort_values(by='age', ascending=True) print(df_sort) # 按score列降序排序 df_sort = df.sort_values(by='score', ascending=False) print(df_sort) # 按多个列排序,先按score降序,score相同时再按age升序 df_sort = df.sort_values(by=['score', 'age'], ascending=[False, True]) print(df_sort) ``` 2. 对Series排序: Series.sort_values(axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last') 参数解释: - axis:指定按行(axis=0)还是按列(axis=1)排序,默认为0。 - ascending:指定升序(ascending=True)还是降序(ascending=False)排序,默认为True。 - inplace:指定是否在原有的Series上进行修改,默认为False。 - kind:指定排序算法,可以选择快速排序(kind='quicksort')、归并排序(kind='mergesort')或堆排序(kind='heapsort'),默认为快速排序。 - na_position:指定缺失值在排序后的位置,可选的有‘last’和'first',默认为‘last’。 示例: ``` import pandas as pd s = pd.Series([9, 7, 3, 1], index=['Tom', 'Jerry', 'Spike', 'Tyke']) print(s) # 升序排序 s_sort = s.sort_values() print(s_sort) # 降序排序 s_sort = s.sort_values(ascending=False) print(s_sort) ``` 总的来说,sort_values函数可以根据指定列名或索引值进行排序,支持多列排序、升序降序、多种排序算法和对缺失值的处理。在数据分析和清洗中应用广泛,对于Python数据分析和机器学习的入门学习者来说,是一个非常常用的函数。 ### 回答3: sort_values是Python pandas模块中的一个方法,用于对DataFrame或者Series数据进行排序操作。sort_values方法支持按照指定的轴(行或列)对数据进行排序,同时也可以指定排序的字段(列)和排序的方式(升序或者降序)。 sort_values主要有三个参数,即'by'、'ascending'和'inplace'。其中,'by'表示排序的依据,可以是一个列名、多个列名组成的列表,也可以是一个Series,表示按照该列的值进行排序;'ascending'表示排序的方式,True表示升序,False表示降序(默认为升序);'inplace'表示是否在原数据上进行排序,True表示直接修改原有数据,False表示排序后生成新的数据。 接下来以一个示例来说明sort_values的用法: 我们有一个数据表,包含了学生的姓名、年龄和成绩 ``` import pandas as pd data = {'Name':['Tom','Jack','Steve','Ricky','Juan','Nash'], 'Age':[20,21,19,18,22,23], 'Score':[99,55,85,76,92,47]} df = pd.DataFrame(data) ``` 按照成绩从小到大排序 ``` df.sort_values(by='Score', inplace=True) ``` 按照年龄从大到小排序 ``` df.sort_values(by='Age', ascending=False, inplace=True) ``` 同时按照成绩和年龄排序(先按照成绩从小到大排序,再按照年龄从大到小排序) ``` df.sort_values(by=['Score', 'Age'], ascending=[True, False], inplace=True) ``` 通过这个例子,我们可以看出sort_values的基本用法:即按照指定的轴、排序方式和排序字段来对数据进行排序操作,同时也可以通过inplace参数来指定是否直接修改原有数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值