一 sorted函数

sorted(iterable,reverse=False,key=函数)

功能:排序
参数:
iterable:可迭代性数据(常用:容器类型数据,range对象,迭代器)
reverse : 是否倒序
默认正序reverse= False(从小到大) 如果reverse=True 代表倒序 (从大到小)
key = 自定义函数 或者 内置函数
返回值:
排序的序列

1.1 从小到大默认排序

listvar = [1,2,-88,-4,5]
# 从小到大默认排序
res = sorted(listvar)
print(res)

执行

[root@node10 python]# python3 test.py
[-88, -4, 1, 2, 5]

1.2 从大到小排序

listvar = [1,2,-88,-4,5]
res = sorted(listvar,reverse=True)
print(res)

执行

[root@node10 python]# python3 test.py
[5, 2, 1, -4, -88]

1.3 按照绝对值排序

需要用到内置函数abs(绝对值函数)

res = abs(-1.5)
print(res)
listvar = [1,2,-88,-4,5]
res = sorted(listvar,key=abs)
print(res)

执行

[root@node10 python]# python3 test.py
1.5
[1, 2, -4, 5, -88]

1.4 按照余数排列

listvar = [19,23,44,57]
def func(n):
return n % 10 res = sorted(listvar,key=func)
print(res)
listvar = [4,1,2,9]
listvar.sort()
print(listvar)

执行

[root@node10 python]# python3 test.py
[23, 44, 57, 19]
[1, 2, 4, 9]

sort 基于原有列表进行修改
sorted 是产生一个新列表

二 filter函数

filter(func,iterable)
功能:过滤数据
如果函数的返回值是True ,代表保留当前数据
如果函数逇返回值是False,代表舍弃当前数据
参数:
func 自定义函数
iterable 可迭代对象(常用:容器类型数据,range对象,迭代器)
返回值
迭代器

取出所有的偶数

listvar = [1,2,3,4,4,56,6,6,7,8,9,10]
# 要所有的偶数,舍弃所有的奇数
def func(n):
if n % 2 == 0:
return True
else:
return False it = filter(func,listvar)
res = list(it)
print(res)

执行

[root@node10 python]# python3 test.py
[2, 4, 4, 56, 6, 6, 8, 10]

使用匿名函数优化

listvar = [1,2,3,4,4,56,6,6,7,8,9,10]
# 要所有的偶数,舍弃所有的奇数 it = filter(lambda n :True if n % 2 == 0 else False,listvar)
print(list(it))

执行

[root@node10 python]# python3 test.py
[2, 4, 4, 56, 6, 6, 8, 10]

三 推导式

  • 通过一行循环判断,遍历出一系列数据的方式是推导式  (简洁方便)

3.1 列表推导式

[1,2,3,4] => [2,4,6,8]

lst = []
for i in range(1,5):
print(i)
lst.append(i)
print(lst)

执行

1
2
3
4
[1, 2, 3, 4]

推导式写法

listvar = [i for i in range(1,5)]
print(listvar)
listvar = [i*2 for i in range(1,5)]
print(listvar)

执行

[root@node10 python]# python3 test.py
[1, 2, 3, 4]
[2, 4, 6, 8]

3.1.1 带有判断条件的列表推导式

[1,2,3,4,4,5,9,6] 只要奇数

lst = [1,2,3,4,4,5,9,6]
lst2 = []
for i in lst:
if i % 2 == 1:
lst2.append(i)
print(lst2)
#推导式写法
res = [i for i in lst if i % 2 == 1]
print(res)

执行

[root@node10 python]# python3 test.py
[1, 3, 5, 9]
[1, 3, 5, 9]

3.1.2 带有双循环的列表推导式

lst1 = [1,2,3]
lst2 = [4,5,6]
for i in lst1:
for j in lst2:
print("%d*%d=%2d " % (i,j,i*j))
#使用推导式
res = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2]
print(res)

执行

[root@node10 python]# python3 test.py
1*4= 4
1*5= 5
1*6= 6
2*4= 8
2*5=10
2*6=12
3*4=12
3*5=15
3*6=18
['1*4= 4 ', '1*5= 5 ', '1*6= 6 ', '2*4= 8 ', '2*5=10 ', '2*6=12 ', '3*4=12 ', '3*5=15 ', '3*6=18 ']

3.1.3 带有条件判断的多循环推导式

使用两个列表,第一行的和第二行对应相乘

lst1 = [1,2,3]
lst2 = [4,5,6]
for i in lst1:
for j in lst2:
if lst1.index(i) == lst2.index(j):
print ("%d*%d=%2d " % (i,j,i*j))
res = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j)]
print(res)

第一行的奇数和第二行的偶数相乘,并打印

lst1 = [1,2,3,4]
lst2 = [5,6,7,8]
for i in lst1:
for j in lst2:
if i % 2== 1 and j %2 == 0:
print ("%d*%d=%2d " % (i,j,i*j))
#是用推导式
res = ["%d*%d=%2d " % (i,j,i*j) for i in lst1 for j in lst2 if i % 2== 1 and j %2 == 0]
print(res)

执行

1*6= 6
1*8= 8
3*6=18
3*8=24
['1*6= 6 ', '1*8= 8 ', '3*6=18 ', '3*8=24 ']

推导式的后面:只能是循环或者 判断(单项分支 只有一个if 没有其他的了)
如果你需要这个值,就把这个值放到for的最左边.

3.2 集合推导式

setvar = {} 代表字典
() 代表空元祖
(1) 代表整型1
(1,) 代表元组
set() 代表空集合

案例:判断一个VIP会员

条件:(1)满足年龄在18到21,存款大于等于5000小于等于5500的人,

统计结果:尊贵VIP卡老x(姓氏),否则开卡格式为:普通会员老*(姓氏)

listvar = [
{"name":"王大宝","age":18,"money":10000},
{"name":"王二宝","age":19,"money":5100},
{"name":"王三宝","age":20,"money":4800},
{"name":"李大宝","age":21,"money":2000},
{"name":"李二宝","age":180,"money":20}
]
setvar = set()
print(type(setvar))
for i in listvar :
if 5000 <=i['money'] <= 5500 and 18 <= i['age'] <= 21:
setvar.add("尊贵vip老"+i['name'][0])
else:
setvar.add("普通会员卡老"+i['name'][0])
print(setvar)
#使用三目运算符+推导式
setvar={"尊贵vip老"+i['name'][0] if 5000 <=i['money'] <= 5500 and 18 <= i['age'] <= 21 else "普通会员卡老"+i['name'][0] for i in listvar} print(setvar)

执行

[root@node10 python]# python3 test.py
<class 'set'>
{'普通会员卡老王', '尊贵vip老王', '普通会员卡老李'}
{'普通会员卡老王', '尊贵vip老王', '普通会员卡老李'}

3.3 字典推导式

3.3.1 enumerate函数

enumerate(iterable,[start=0])  #start是一个可选对象
功能:枚举 ; 将索引号和iterable中的值,一个一个拿出来配对组成元组放入迭代器中
参数:
iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)
start: 可以选择开始的索引号(默认从0开始索引)
返回值:迭代器

案例

listvar = ["a","b","c","d"]
res = enumerate(listvar)
print (res)

执行

[root@node10 python]# python3 test.py
<enumerate object at 0x7f3c3f505750>

使用迭代器

listvar = ["a","b","c","d"]
res = enumerate(listvar)
print (res)
# Iterator 迭代器 Iterable 可迭代对象
from collections import Iterator,Iterable
print(isinstance(res,Iterator))
print(list(res))

执行

[root@node10 python]# python3 test.py
<enumerate object at 0x7f7851fc4750>
True
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

特别指定开始值是14 不是默认0

listvar = ["a","b","c","d"]
res = enumerate(listvar)
print (res)
# Iterator 迭代器 Iterable 可迭代对象
from collections import Iterator,Iterable
print(isinstance(res,Iterator))
print(list(res)) res = enumerate(listvar,start=14)
print(list(res))

执行

[root@node10 python]# python3 test.py
<enumerate object at 0x7f04d1b42708>
True
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
[(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]

转换为字典

listvar = ["a","b","c","d"]
res = enumerate(listvar)
print (res)
# Iterator 迭代器 Iterable 可迭代对象
from collections import Iterator,Iterable
print(isinstance(res,Iterator))
print(list(res)) res = enumerate(listvar,start=14)
print(list(res),type(list(res)))
#转换
lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]
res = dict(lst)
print (res)

执行

[root@node10 python]# python3 test.py
<enumerate object at 0x7f2f5ceb3750>
True
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
[(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'>
{14: 'a', 15: 'b', 16: 'c', 17: 'd'}

使用enumrate实现字典推导式

listvar = ["a","b","c","d"]
res = enumerate(listvar)
print (res)
# Iterator 迭代器 Iterable 可迭代对象
from collections import Iterator,Iterable
print(isinstance(res,Iterator))
print(list(res)) res = enumerate(listvar,start=14)
print(list(res),type(list(res))) lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]
res = dict(lst)
print (res) dictvar = {a:b for a,b in enumerate(listvar,start=9)}
print (dictvar)

执行

<enumerate object at 0x7f28329d1900>
True
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
[(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'>
{14: 'a', 15: 'b', 16: 'c', 17: 'd'}
{9: 'a', 10: 'b', 11: 'c', 12: 'd'}

可以直接使用dict强转

listvar = ["a","b","c","d"]
res = enumerate(listvar)
print (res)
# Iterator 迭代器 Iterable 可迭代对象
from collections import Iterator,Iterable
print(isinstance(res,Iterator))
print(list(res)) res = enumerate(listvar,start=14)
print(list(res),type(list(res))) lst = [(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')]
res = dict(lst)
print (res) dictvar = {a:b for a,b in enumerate(listvar,start=9)}
print (dictvar) res = dict(enumerate(listvar,start=10))
print (res)

执行

<enumerate object at 0x7f54f8c10900>
True
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
[(14, 'a'), (15, 'b'), (16, 'c'), (17, 'd')] <class 'list'>
{14: 'a', 15: 'b', 16: 'c', 17: 'd'}
{9: 'a', 10: 'b', 11: 'c', 12: 'd'}
{10: 'a', 11: 'b', 12: 'c', 13: 'd'}

3.3.2 zip

zip(iterable, ... ...)
功能: 将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中
iterable: 可迭代性数据 (常用:迭代器,容器类型数据,可迭代对象range)
返回: 迭代器 # 注意:2个值得索引号需要相同,如果有余出的自动舍弃.

案例

from collections import Iterator,Iterable
list1 = ["a","b","c","d"]
list2 = [1,2,3,4,5,6,7,8,8,9,99,0,0]
it = zip(list1,list2)
print(isinstance(it,Iterator))
print(list(it))
#返回值 [('a', 1), ('b', 2), ('c', 3), ('d', 4)] # 利用zip实现字典推导式
dic = { k:v for k,v in zip(list1,list2) }
print(dic) # 利用dict 强转zip迭代器变成字典
res = dict(zip(list1,list2))
print(res)

执行

[root@node10 python]# python3 test.py
True
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
{'a': 1, 'b': 2, 'c': 3, 'd': 4}

019.Python函数sorted,filter和推导式的更多相关文章

  1. 小学生都能学会的python(<lamda匿名函数,sorted(),filter(),map(),递归函数>)

    小学生都能学会的python(<<lamda匿名函数,sorted(),filter(),map(),递归函数,二分法>> 1. lambda 匿名函数 lambda 参数: ...

  2. 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)

    # 『Python基础-12』各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的 ...

  3. 记录我的 python 学习历程-Day12 生成器/推导式/内置函数Ⅰ

    一.生成器 初识生成器 生成器的本质就是迭代器,在python社区中,大多数时候都把迭代器和生成器是做同一个概念. 唯一的不同就是: 迭代器都是Python给你提供的已经写好的工具或者通过数据转化得来 ...

  4. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  5. python 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    http://www.cnblogs.com/linhaifeng/articles/7580830.html 三元表达式.列表推导式.生成器表达式.递归.匿名函数.内置函数

  6. python之生成器和列表推导式

    一.生成器函数 1.生成器 就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现). 2.构建生成器的两种方式 1,生成 ...

  7. python note 12 生成器、推导式

    1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...

  8. 《Python》 生成器和列表推导式

    一.初识生成器: 生成器就是自己用Python代码写的迭代器,生成器的本质就是迭代器. 1.Python中提供的生成器: 1.生成器函数: 使用yield语句而不是return语句返回结果.yield ...

  9. Python面试题之列表推导式

    题目要求: 生成如下列表 [[0,0,0,0,0,],[0,1,2,3,4,],[0,2,4,6,8,],[0,3,6,9,12,]] (考察列表生成式和基本逻辑推理) 方法1: list1 = [] ...

随机推荐

  1. Sentinel全局Feign默认熔断设计实现

    写在前面 用XMind画了一张导图记录Spring Cloud Alibaba的学习笔记(源文件对部分节点有详细备注和参考资料,由于太大就没展示全部,欢迎关注我的公众号:阿风的架构笔记 后台发送[导图 ...

  2. BUAA_OO_2020_第三单元总结

    BUAA_OO_2020_第三单元总结 JML理论基础 简介 JML(Java Modeling Language)是一种用于对JAVA程序进行规格化设计的语言,其通过定义接口所包含方法的行为,来约束 ...

  3. 强大的工具(一):Capslock+ 3.x版本

    1 概述 作者终于把Capslock+更新到了3.x版本了,所以就更了这篇博客. 2.x版本的可以戳这里. 3.x版本与2.x版本的主要不同是更新了新的键盘布局,更加顺手,下面让我们一起来看一下吧. ...

  4. 2. Mybatis Select

    mybatis select是mybatis 中最常用的元素之一. 对简单的查询,select 元素的配置是相当简单的: <?xml version="1.0" encodi ...

  5. 我最近做了一个react的后台管理系统,用于快速创建后台项目模板

    react-ant-admin 此框架使用与二次开发,前端框架使用react,UI框架使用ant-design,全局数据状态管理使用redux,ajax使用库为axios.用于快速搭建中后台页面.欢迎 ...

  6. Circular Sequence UVA - 1584

    ​ Some DNA sequences exist in circular forms as in the following figure, which shows a circular sequ ...

  7. Day13_64_线程的优先级

    线程的调度 * 单核CPU在某一时刻只能执行一条指令,线程只有得到CPU的时间片,也就是使用权,才可以执行指令 * 在单核CPU的机器上线程不是并行运行的,而是频繁切换运行的,只有在多个CPU上线程才 ...

  8. junit+maven单元测试

    一.概念 junit是一个专门测试的框架 集合maven进行单元测试,可批量测试类中的大量方法是否符合预期 二.作用:单元测试:测试的内容是类中的方法,每一个方法都是独立测试的.方法是测试的基本单位. ...

  9. 【C++】从零开始,只使用FFmpeg,Win32 API,实现一个播放器(一)

    前言 起初只是想做一个直接读取视频文件然后播放字符动画的程序.我的设想很简单,只要有现成的库,帮我把视频文件解析成一帧一帧的原始画面信息,那么我只需要读取里面的每一个像素的RGB数值,计算出亮度,然后 ...

  10. ListBox控件简单的数据绑定

    <ListBox Margin="17,8,15,26" Name="ListBoxName" ItemsSource="{Binding Ta ...