python sorte、sorted排序
# sort()排序方法
sort() :仅对list对象进行排序,会改变list自身的顺序,没有返回值,即原地排序;
你也可以使用
list.sort()
方法,它会直接修改原列表(并返回None
以避免混淆),通常来说它不如sorted()
方便 ——— 但如果你不需要原列表,它会更有效率。另外一个区别是,
list.sort()
方法只是为列表定义的,而sorted()
函数可以接受任何可迭代对象。
list.sort(key=None, reverse=False)
1. 此函数方法对列表内容进行正向排序,排序后的新列表会覆盖原列表(id不变),也就是sort排序方法是直接修改原列表list排序方法。
a = [5,7,6,3,4,1,2] a.sort() # 升序排序 print(a) # [1, 2, 3, 4, 5, 6, 7] a.sort(reverse=True) # 降序排序 print(a) # [7, 6, 5, 4, 3, 2, 1]
dict组成的list排序
参数key获取dict的key或value值进行排序
a = [{'dell': 200}, {'mac': 100}] a.sort(key=lambda x: list(x.values())) print(a) # [{'mac': 100}, {'dell': 200}]
a = [{'dell': 200}, {'mac': 100}] a.sort(key=lambda x: list(x.keys())) print(a) #[{'dell': 200}, {'mac': 100}]
按dict的长度排序
a = [{'mac': 200, 'huawei': 300, 'xiaomi': 150}, {'vivo': 210, 'Galaxy': 100}, {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}] a.sort(key=lambda x: len(x)) print(a) #[{'vivo': 210, 'Galaxy': 100}, {'mac': 200, 'huawei': 300, 'xiaomi': 150}, {'Smartisan': 120, 'oppo': 200, 'lenovo': 50, 'meizu': 80}]
使用
根据字典的 "year" 值对字典列表进行排序:
cars = [ {'car': 'Porsche', 'year': 1963}, {'car': 'Audi', 'year': 2010}, {'car': 'BMW', 'year': 2019}, {'car': 'Volvo', 'year': 2013} ] def myFunc(e): return e['year'] cars.sort(key=myFunc,reverse=True) print(cars) # [{'car': 'BMW', 'year': 2019}, {'car': 'Volvo', 'year': 2013}, {'car': 'Audi', 'year': 2010}, {'car': 'Porsche', 'year': 1963}]
多维元素 组成的list排序
按tuple的第2个元素排序
a = [('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')] a.sort(key=lambda x: x[1]) # lambda 函数:指定用于排序的元素 print(a) #[('mac', 1, 'c'), ('linux', 2, 'a'), ('mac', 3, 'b')]
按tupel的第1个和3个元素进行排序
a = [('mac', 3, 'b'), ('linux', 2, 'a'), ('mac', 1, 'c')] a.sort(key=lambda x: (x[0],x[2])) print(a) #[('linux', 2, 'a'), ('mac', 3, 'b'), ('mac', 1, 'c')]
2. 有的时候会需要一个排序好的列表,而又想保存原有未排序列表,若这么操作:
a = [5,7,6,3,4,1,2] b = a.sort() print(b) # None
# 这种方法得到的是一个空值,可以使用 sorted()方法
#sorted()方法
a = [5,7,6,3,4,1,2] b = sorted(a) print(b) #[1, 2, 3, 4, 5, 6, 7]
# sorted()方法可以用在任何数据类型的序列中,返回的总是一个列表形式:
c = sorted('zhenglia.com') print(c) # ['.', 'a', 'c', 'e', 'g', 'h', 'i', 'l', 'm', 'n', 'o', 'z']
sorted() 作为 Python 内置函数之一,其功能是对序列(列表、元组、字典、集合、还包括字符串)进行排序。
sorted() 函数的基本语法格式如下:
list = sorted(iterable, key=None, reverse=False)
其中,iterable 表示指定的序列,key 参数可以自定义排序规则;reverse 参数指定以升序(False,默认)还是降序(True)进行排序。sorted() 函数会返回一个排好序的列表。
注意,key 参数和 reverse 参数是可选参数,即可以使用,也可以忽略。
sorted 用于对集合进行排序(这里集合是对可迭代对象的一个统称,他们可以是列表、字典、set、甚至是字符串),它的功能非常强大
1、对列表排序,返回的对象不会改变原列表
对列表排序
a = [5,7,6,3,4,1,2] print(sorted(a)) # [1, 2, 3, 4, 5, 6, 7] print(a) # [5, 7, 6, 3, 4, 1, 2]
string排序:返回字符组成的list
a = 'zhenglia.com' b = sorted(a) print(b) #['.', 'a', 'c', 'e', 'g', 'h', 'i', 'l', 'm', 'n', 'o', 'z']
string分割排序
a = a = 'My name is Zhenglia.com' b = sorted(a.split(),key=str.lower) print(b) #['is', 'my', 'name', 'zhenglia.com']
string分割 按长度排序
a = 'my name is zhenglia.com' # b = sorted(a.split(),key=str.lower) b = sorted(a.split(),key=lambda x:len(x)) print(b) #['my', 'is', 'name', 'zhenglia.com']
等价于
def myFunc(e): return len(e) b = sorted(a.split(),key=myFunc) print(b) # ['my', 'is', 'name', 'zhenglia.com']
2. 根据自定义规则来排序,使用参数:key
# 使用key,默认搭配lambda函数使用 a = ['one', 'to', 'three'] b = sorted(a,key=lambda x:len(x)) print(b) # ['to', 'one', 'three']
3. dict 的key/value排序:返回key/value排序后组成的list
key排序 (key的长度排序)
dict = {'a1':1,'b22':2,'c33':3} ans = sorted(dict) print(ans) # ['a1', 'b22', 'c333']
value的大小排序
dict = {'a':1,'b':2,'c':3} ans = sorted(dict.values()) print(ans) # [1, 2, 3]
根据value的大小,完整的字典排序
dict = {'a1':1,'b22':2,'c333':3} ans = sorted(dict.items(),key=lambda x:x[1]) print(ans) #[('a1', 1), ('b22', 2), ('c333', 3)]
扩展:
dict.items()这个函数的返回值是列表套着元组,元组里面是该字典的键和值
dict = {'a1':1,'b22':2,'c333':3} print(dict.items()) # dict_items([('a1', 1), ('b22', 2), ('c333', 3)]) print(list(dict.items())) # [('a1', 1), ('b22', 2), ('c333', 3)]
Python 字典 items() 方法以列表返回视图对象,是一个可遍历的key/value 对。
dict.keys()、dict.values() 和 dict.items() 返回的都是视图对象( view objects),提供了字典实体的动态视图,这就意味着字典改变,视图也会跟着变化。
视图对象不是列表,不支持索引,可以使用 list() 来转换为列表。
我们不能对视图对象进行任何的修改,因为字典的视图对象都是只读的。
使用根据字典的 "year" 值对字典列表进行排序:
def myFunc(e): return e['year'] cars = [ {'car': 'Porsche', 'year': 1963}, {'car': 'Audi', 'year': 2010}, {'car': 'BMW', 'year': 2019}, {'car': 'Volvo', 'year': 2013} ] b = sorted(cars,key=myFunc) print(b) # [{'car': 'Porsche', 'year': 1963}, {'car': 'Audi', 'year': 2010}, {'car': 'Volvo', 'year': 2013}, {'car': 'BMW', 'year': 2019}]
4.多维元素的排序
dict组成的tuple或list排序:方法类似sort()
a = ({'a':1},{'b':2},{'c':3}) ans = sorted(a,key=lambda x:list(x.values())) print(ans) #[{'a': 1}, {'b': 2}, {'c': 3}]
tuple组成的tuple或list排序:方法类似sort()
对元组构成的元组
a = (('rose',23,'women'),('wangmei',25,'women'),('ligang',26,'man')) ans = sorted(a,key=lambda x:x[1]) #key=lambda x: x[1]中可以任意选定x中可选的位置进行排序 print(ans) # [('rose', 23, 'women'), ('wangmei', 25, 'women'), ('ligang', 26, 'man')]
这里,元组里面的每一个元素都为元组,key参数传入了一个lambda函数表达式,其x就代表列表里的每一个元素,然后分别利用索引返回元素内的第一个和第二个元素,这就代表了sorted()函数利用哪一个元素进行排列。而reverse参数就如同上面讲的一样,起到逆排的作用。默认情况下,reverse参数为False。
a = (('rose',23,'women'),('wangmei',25,'women'),('ligang',26,'man')) ans = sorted(a,key=lambda x:(x[2],x[1])) # 对tuple的第1、1个元素排序 print(ans) # [('ligang', 26, 'man'), ('rose', 23, 'women'), ('wangmei', 25, 'women')]
根据自定义规则来排序,对元组构成的列表进行排序
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10),] ans = sorted(students, key=lambda x : x[2],reverse=True) # sort by age print(ans) # [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
sort()与sorted()的区别和联系
sort():仅作用于list对象,没有返回值,修改对象本身;
sorted():作用于所有可迭代对象,返回新的排序对象,不修改原对象;
sort()函数不需要复制原有列表,消耗的内存较少,效率也较高;
sorted()函数功能强大,使用的范围更为广泛。