当前位置:首页 > 日记本 > 正文内容

python sorte、sorted排序

zhangchap3年前 (2021-10-09)日记本265

# 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组成的tuplelist排序:方法类似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组成的tuplelist排序:方法类似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()函数功能强大,使用的范围更为广泛。


标签: python笔记
分享给朋友:

相关文章

python补全网址代码示例

from urllib.parse import urljoin absurl = urljoin(backend,url) #backend:根...

python url.parse模块编码解码

from urllib.parse import quote,unquote,urlencode # 对汉字进行编码使用 quote ...

python 获取当前的路径并切换

import os curdir = os.path.dirname(__file__) #获取当前的路径,若运行在当前文件夹,是获取不到当前路径的,最保险的...

pip install 安装出现:Requirement already satisfied 的解决办法

刚开始装上python安装轮子挺顺利的,后来再使用pip install 安装开始报错,网上有解决方案说用国内的源就没问题,但是我的源早就改成国内的了,用了另外一种解决方案,搞定加上--target参...

python jieba分词自定义分词器及自定义词典

import jieba jieba.initialize() # 自定义分词器的写法 n_c = jieba.Tokenizer(dictionary=...

python判断当前系统为win还是Linux

使用sys模块进行判断,以便启用在win平台下不支持的代码:import sys p = sys.platform if p != &#...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。