python中sorted的用法append_python sorted()排序詳解

排序,在編程中經常遇到的算法,我也在幾篇文章中介紹了一些關于排序的算法。有的高級語言內置了一些排序函數。本文講述Python在這方面的工作。供使用

內置函數sorted()/list.sort()的使用

簡單應用

python對list有一個內置函數:

>>> a=[5,3,6,1,9,2]

>>>

1

2

3

4

5

6

>>>a=[5,3,6,1,9,2]

>>>sorted(a)#a經過sorted之后,得到一個排序結果

[1,2,3,5,6,9]#但是,原有的a并沒有受到影響

>>>a

[5,3,6,1,9,2]

也可以使用list.sort()來進行上述操作。

>>> a.sort()

>>> a #注意這里,經過list.sort()之后,原有

[1, 2, 3, 5, 6, 9] #a的順序已經發生變化,與上述不同之處。

1

2

3

4

>>>a.sort()

>>>a#注意這里,經過list.sort()之后,原有

[1,2,3,5,6,9]#a的順序已經發生變化,與上述不同之處。

sorted和list.sort()的區別:list.sort()只能對list類型進行排序。如下:

>>> b_dict={1:'e',3:'m',9:'a',5:'e'}

>>> b_dict.sort()

Traceback (most recent call last):

File "", line 1, in

AttributeError: 'dict' object has no attribute 'sort'

1

2

3

4

5

6

>>>b_dict={1:'e',3:'m',9:'a',5:'e'}

>>>b_dict.sort()

Traceback(mostrecentcalllast):

File"",line1,in

AttributeError:'dict'objecthasnoattribute'sort'

而sorted則不然,看例子:

>>> b_dict

{1: 'e', 3: 'm', 5: 'e', 9: 'a'}

>>> sorted(b_dict)

[1, 3, 5, 9]

1

2

3

4

5

>>>b_dict

{1:'e',3:'m',5:'e',9:'a'}

>>>sorted(b_dict)

[1,3,5,9]

sorted之后,上述對dictinoary中,將key值取出并排序,返回list類型的排序結果。

按照指定關鍵詞排序

在list.sort()和sorted中,都可以根據指定的key值排序。例如:

sorted的例子:

>>> qw="I am Qiwsir you can read my articles im my blog".split()

>>> qw

['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']

>>> sorted(qw,key=str.lower) #按照字母升序排列

['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

1

2

3

4

5

6

>>>qw="I am Qiwsir you can read my articles im my blog".split()

>>>qw

['I','am','Qiwsir','you','can','read','my','articles','im','my','blog']

>>>sorted(qw,key=str.lower)#按照字母升序排列

['am','articles','blog','can','I','im','my','my','Qiwsir','read','you']

list.sort()的例子:

>>> qw

['I', 'am', 'Qiwsir', 'you', 'can', 'read', 'my', 'articles', 'im', 'my', 'blog']

>>> qw.sort(key=str.lower)

>>> qw

['am', 'articles', 'blog', 'can', 'I', 'im', 'my', 'my', 'Qiwsir', 'read', 'you']

1

2

3

4

5

6

>>>qw

['I','am','Qiwsir','you','can','read','my','articles','im','my','blog']

>>>qw.sort(key=str.lower)

>>>qw

['am','articles','blog','can','I','im','my','my','Qiwsir','read','you']

此外,key還可以接收函數的單一返回值,按照該值排序。例如:

>>> name_mark_age = [('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16)]

>>> sorted(name_mark_age, key = lambda x: x[2]) #根據年齡排序

[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16)]

>>> sorted(name_mark_age, key = lambda x: x[1]) #根據等級排序

[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14)]

>>> sorted(name_mark_age, key = lambda x: x[0]) #根據姓名排序

[('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhangsan', 'A', 15)]

1

2

3

4

5

6

7

8

9

10

>>>name_mark_age=[('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16)]

>>>sorted(name_mark_age,key=lambdax:x[2])#根據年齡排序

[('LISI','B',14),('zhangsan','A',15),('WANGWU','A',16)]

>>>sorted(name_mark_age,key=lambdax:x[1])#根據等級排序

[('zhangsan','A',15),('WANGWU','A',16),('LISI','B',14)]

>>>sorted(name_mark_age,key=lambdax:x[0])#根據姓名排序

[('LISI','B',14),('WANGWU','A',16),('zhangsan','A',15)]

除了上述方式,python中還提供了一個選擇循環選擇指定元組值的模塊

>>> from operator import itemgetter #官方文檔:https://docs.python.org/2/library/operator.html#module-operator

>>> name_mark_age.append(('zhaoliu','B',16))

>>> name_mark_age

[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(2)) #按照年齡排序

[('LISI', 'B', 14), ('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age,key=itemgetter(1,2)) #先按照等級排序,相同等級看年齡

[('zhangsan', 'A', 15), ('WANGWU', 'A', 16), ('LISI', 'B', 14), ('zhaoliu', 'B', 16)]

1

2

3

4

5

6

7

8

9

10

11

>>>fromoperatorimportitemgetter#官方文檔:https://docs.python.org/2/library/operator.html#module-operator

>>>name_mark_age.append(('zhaoliu','B',16))

>>>name_mark_age

[('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16),('zhaoliu','B',16)]

>>>sorted(name_mark_age,key=itemgetter(2))#按照年齡排序

[('LISI','B',14),('zhangsan','A',15),('WANGWU','A',16),('zhaoliu','B',16)]

>>>sorted(name_mark_age,key=itemgetter(1,2))#先按照等級排序,相同等級看年齡

[('zhangsan','A',15),('WANGWU','A',16),('LISI','B',14),('zhaoliu','B',16)]

在官方文檔上,有這樣一個例子,和上面的操作是完全一樣的。

>>> class Student:

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))

>>> student_objects = [

Student('john', 'A', 15), #注意這里,用class Student來生成列表內的值

Student('jane', 'B', 12), #因此,可以通過student_objects[i].age來訪問某個名稱的年齡,i=0,則是john的年齡

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

]

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

>>>classStudent:

def__init__(self,name,grade,age):

self.name=name

self.grade=grade

self.age=age

def__repr__(self):

returnrepr((self.name,self.grade,self.age))

>>>student_objects=[

Student('john','A',15),#注意這里,用class Student來生成列表內的值

Student('jane','B',12),#因此,可以通過student_objects[i].age來訪問某個名稱的年齡,i=0,則是john的年齡

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

]

>>>sorted(student_objects,key=lambdastudent:student.age)

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

也可以引用operator模塊來實現上述排序

>>>from operator import attrgetter

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

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

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

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

1

2

3

4

5

6

>>>fromoperatorimportattrgetter

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

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

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

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

總結:sorted的能力超強,不僅實現排序,還能按照指定關鍵詞排序。

以上例子都是升序,如果,增加reverse=True。例如:

>>>from operator import itemgetter

>>> name_mark_age

[('zhangsan', 'A', 15), ('LISI', 'B', 14), ('WANGWU', 'A', 16), ('zhaoliu', 'B', 16)]

>>> sorted(name_mark_age, key=itemgetter(2),reverse=True)

[('WANGWU', 'A', 16), ('zhaoliu', 'B', 16), ('zhangsan', 'A', 15), ('LISI', 'B', 14)]

1

2

3

4

5

6

>>>fromoperatorimportitemgetter

>>>name_mark_age

[('zhangsan','A',15),('LISI','B',14),('WANGWU','A',16),('zhaoliu','B',16)]

>>>sorted(name_mark_age,key=itemgetter(2),reverse=True)

[('WANGWU','A',16),('zhaoliu','B',16),('zhangsan','A',15),('LISI','B',14)]

2018-05-29-012523.png

2020012309512985.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373448.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373448.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373448.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云上的播放框架變得簡單:Openshift模塊

僅僅幾年前,找到一個負擔得起的Java Web應用程序托管解決方案是一項艱巨的任務,而尋找免費的托管解決方案是一項不可能的任務。 更不用說甚至考慮自動縮放,單命令部署,持續集成等事情,這都是科幻小說。 去年見證了云計…

C#中的yield return與Unity中的Coroutine(協程)(下)

Unity中的Coroutine(協程) 估計熟悉Unity的人看過或者用過StartCoroutine() 假設我們在場景中有一個UGUI組件, Image: 將以下代碼綁定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

字節流轉化為文件流_C#文件轉換為字節流及字節流轉換為文件

本文講解了C#實現文件轉換為字節流的方法。文件轉換為字節流的步驟如下1、通過文件流打開指定文件(FileStream fs);2、定義字節流(byte[] fileBytenew byte[fs.Length]);3、把文件讀取到字節流(fs.Read(fileByte,0,fileByte.Length));4、關閉…

Spring和JSF集成:導航

我希望這是有關我在Spring和JavaServer Faces之間提供深度集成的努力的一系列博客中的第一篇。 這里提到的所有內容都是“正在進行中的工作”,因此,如果您簽出代碼,請注意它是一個不斷變化的目標。 期待一些粗糙的邊緣,如果有時會…

【CSS3動畫】transform對文字及圖片的旋轉、縮放、傾斜和移動

前言:之前我有寫過CSS3的transform這一這特性,對于它的用法,還不是很透徹,今天補充補充,呵呵 你懂的,小司機準備開車了。 a)再提一提transform的四個屬性 ①旋轉--->rotate(參數a),單位deg&a…

宏的用法與簡介

預處理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因為他們由預處理器解釋的&#xff0c;所以稱作預處理指令。預處理器讀取源代碼&#xff0c;然后對其修改&#xff0c;并把修改過的…

django 日志寫入mysql_如何將django orm模型 寫入數據庫

1、指定連接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置連接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的數據庫名稱USER: root, #你的數據庫用戶名PASSWORD: , #你的數…

ORM的問題第2部分–查詢

在我以前關于對象關系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我討論了在處理當今常見的ORM&#xff08;包括Hibernate&#xff09;時遇到的各種問題。 其中包括與從POJO生成架構有關的問題&#xff0c;實際性能和不斷出現的維護問題。 本質上&#xff0c;結論…

【轉】如何減少接口響應時間

Premature optimization is the root of all evil. — Donald Knuth 對于程序優化&#xff0c;我一直采取保守的態度&#xff0c;除非萬不得已。但是隨著業務的不斷發展&#xff0c;程序越來越復雜&#xff0c;代碼越寫越多&#xff0c;優化似乎是終有一天會到來的事情。 那么對…

數據庫行轉列在現實需求中的用法

select t.客戶姓名,sum(case when t.收款類型首款 then t.金額 else 0 end as 首款),sum(case when t.收款類型尾款 then t.金額 else 0 end as 尾款) from table t group by t.客戶姓名 這段sql的意思 是 查詢出所有客戶收款信息 然后按客戶分組 分組后 然后將這個客戶的所…

mysql生產環境加索引_【生產篇】_MySQL環境下如何查看基于表的索引定義

【引言】今天中午項目組來一需求&#xff0c;欲在MySQL環境的某張表下創建幾個BTREE索引。要創建索引&#xff0c;首先需要了解基表的表結構&#xff0c;以及已經包含的索引。Oracle的表結構大家都很熟悉&#xff0c;但MySQL表結構和已創建索引的查看怎么操作&#xff0c;本文將…

Hadoop模式介紹-獨立,偽分布式,分布式

了解了什么是Hadoop之后&#xff0c;讓我們在單機上啟動Hadoop&#xff1a; 這篇文章包含在ubuntu上安裝Hadoop的說明。 這是Hadoop安裝的快速分步教程。 在這里&#xff0c;您將獲得以獨立模式 &#xff08;單節點集群&#xff09;安裝Hadoop所需的所有命令及其說明&#xff0…

apk反編譯方式

一、Apk反編譯得到Java源代碼 下載上述反編譯工具包&#xff0c;打開apk2java目錄下的dex2jar-0.0.9.9文件夾&#xff0c;內含apk反編譯成java源碼工具&#xff0c;以及源碼查看工具。 apk反編譯工具dex2jar&#xff0c;是將apk中的classes.dex轉化成jar文件 源碼查看工具jdgui…

優化Hibernate所鼓勵的7大措施

優化Hibernate所鼓勵的7大措施&#xff1a; 1.盡量使用many-to-one&#xff0c;避免使用單項one-to-many2.靈活使用單向one-to-many3.不用一對一&#xff0c;使用多對一代替一對一4.配置對象緩存&#xff0c;不使用集合緩存5.一對多使用Bag 多對一使用Set6.繼承使用顯示多態 HQ…

如何用c 控制mysql數據庫_用C語言操作MySQL數據庫

函數描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查詢更改&#xff0f;刪除&#xff0f;插入的行數。mysql_autocommit()切換autocommit模式&#xff0c;ON/OFFmysql_change_user()更改打開連接上的用戶和數據庫。mysql_charset_name()返回用于連接的默認字符集的…

數據結構(RMQ):POJ 3624 Balanced Lineup

Balanced LineupDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a conti…

Apache Thrift快速入門教程

Thrift是一種跨語言RPC框架&#xff0c;最初是在Facebook上開發的&#xff0c;現在作為Apache項目開源。 這篇文章將描述如何以不同的模式&#xff08;例如阻塞&#xff0c;非阻塞和異步&#xff09;編寫Thrift服務和客戶端。 &#xff08;我覺得后兩種模式的文檔較少&#xff…

數組拆分為新數組

package com.classes;//已知數組a&#xff0c;將奇數位置元素存到b數組中&#xff0c;偶數位置元素存到c數組中public class Shuzu1118_4 { public static void main(String[] args) { int [] a{3,6,9,1,4,7,2,5,8}; int [] b; //定義數組b int [] c; //定義數組c//先找出數組…

java數組交集_java數組的交集和并集

前兩天給我出了一道題&#xff0c;求數組的并集和交集&#xff0c;然后我試著寫一下&#xff0c;很尷尬&#xff0c;由于長時間沒有寫過代碼&#xff0c;一開始數組是如何定義的給忘了。當時我說了我的思路&#xff0c;不過也是很low的做法&#xff0c;查閱網上的一些資料&…

ADF聲明性組件示例

在我以前的文章中&#xff0c;我答應展示如何為智能值列表創建ADF聲明性組件。 因此&#xff0c;我將創建一個包含三個元素的組件&#xff1a;標簽&#xff0c;輸入文本和值的組合框列表。 那很容易。 我在工作空間中創建了一個單獨的ADF ViewController項目&#xff1a; 在此項…