Python列表字典推导式
【一】语法
列表推导式可以利用列表,元组,字典,集合等数据类型,快速的生成一个特定需要的列表。
语法格式如下
[表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
【二】列表推导式
【1】为什么要用列表推导式?
- 列表推导式为我们提供了一种从序列创建列表的简单途径,它书写简单,执行效率比循环高。
- 下面我们通过代码直观的感受一下列表推导式的魅力。
(1)直接从序列中构建列表
number_list = []
for i in range(5):
number_list.append(i)
print(number_list) # [0, 1, 2, 3, 4]
(2)使用列表推导式
number_list = [i for i in range(5)]
print(number_list) # [0, 1, 2, 3, 4]
【2】列表推导式的应用
(1)新生成列表的每个元素都可以是任意的表达式或对象
test = [1, 2, 3]
print([i * i for i in test])
# [1,4,9]
print([[i, i + 2] for i in test])
# [[1,3],[2,4],[3,5]]
(2)让每个元素执行相同的操作
# 原始列表 : 每个元素都有空格
some_animals = [' dog', 'cat ', ' sheep ']
# 列表生成式: 新的列表,每个元素都去除掉了空格
some_animals_new = [i.strip() for i in some_animals]
print(some_animals_new)
# ['dog','cat','sheep']
(3)加入嵌套循环
test_1 = [1, 2, 3]
test_2 = [4, 5, 6]
# 列表生成式 : 遍历两个列表并取出每一个列表的元素 做乘法运算
list_one = [x * y for x in test_1 for y in test_2]
print(list_one)
# [4,5,6,8,10,12,12,15,18]
# 列表生成式 : 遍历两个列表并取出每一个列表的元素 做新列表的生成
list_two = [[x, x + y] for x in test_1 for y in test_2]
print(list_two)
# [[1, 5], [1, 6], [1, 7], [2, 6], [2, 7], [2, 8], [3, 7], [3, 8], [3, 9]]
### 注意通过这两个print体会谁是内层循环,谁是外层循环
# 列表生成式 : 遍历两个列表并取出每一个列表对应索引的元素 做乘法运算
list_three = [test_1[i] * test_2[i] for i in range(len(test_1))]
print(list_three)
# [4, 10, 18]
# 列表生成式 : 遍历两个列表并取出每一个列表对应索引的元素 做乘法运算
list_four = [x * y for x, y in zip(test_1, test_2)]
print(list_four)
# [4, 10, 18]
(4)实现行列转换
test = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
list_new = [[row[i] for row in test] for i in range(len(test[0]))]
print(list_new)
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
(5)加入判断条件,组成过滤器
- 从一个给定的列表中选出偶数组成一个新的列表
test = [1, 2, 3, 4, 5, 6]
list_one = [x for x in test if x % 2 == 0]
print(list_one)
# [2, 4, 6]
list_two = list(filter(lambda x: x % 2 == 0, test))
print(list_two)
# [2, 4, 6]
- filter是Python中的一个内嵌函数,它有两个参数,
- 其中第一个参数是一个函数
- 第二个参数是一个迭代器
- 返回值是布尔类型
- 它的作用是将迭代器中的每一个元素都用第一个函数进行判断
- 为真则保留
- 反之则去除
- 从而也形成了过滤的作用。
- 如果此处对lambda表达式有疑惑,不妨可以看看有关函数中对lambda表达式的介绍。
(6)判断列表中有几个对称数
test = [1221, 1234, 12321, 14441, 15672]
list_one = sum([num == num[::-1] for num in map(str, test)])
print(list_one)
# 3
list_two = len([num for num in map(str, test) if num == num[::-1]])
print(list_two)
# 3
【2】列表生成式
- 只需要将列表推导式中的中括号改成小括号就变成了生成式。
(1)与推导式的区别
- 列表推导式一次性返回所有的元素,生成式每次只会返回一个元素
- 当生成的元素数量非常多时,生成式占用的空间非常小,而推导式则会占用大量的空间
- 推导式的执行效率高,所以推荐在数据量小的时候使用
(2)示例
test = [1, 2, 3]
list_one = (i * i for i in test)
print(list_one)
# <generator object <genexpr> at 0x0000026B4E6C0D60>
list_two = list(i * i for i in test)
print(list_two)
# [1, 4, 9]
list_three = ([i, i + 2] for i in test)
print(list_three)
# <generator object <genexpr> at 0x0000026B4E6C09E0>
- 从以上代码我们可以看出生成式的直接返回结果时一个生成器。
- 素数判断
import math
def is_prime(n):
if n == 2: return True
if n < 2 or n % 2 == 0: return False
return all(n % i for i in range(3, int(math.sqrt(n) + 1), 2))
print(is_prime(23))
# True
【3】字典推导式
- 有了列表推导式的概念,字典推导式学起来就非常简单了,语法格式如下:
{键:值 for 迭代变量 in 可迭代对象 [if 条件表达式]}
- 案例
my_dict = {key: value for key in range(3) for value in range(2)}
print(my_dict)
# {0: 1, 1: 1, 2: 1}
- 最常见的哪里还是下述的代码,遍历一个具有键值关系的可迭代对象。
my_tuple_list = [('name', '橡皮擦'), ('age', 18), ('class', 'no1'), ('like', 'python')]
my_dict = {key: value for key, value in my_tuple_list}
print(my_dict)
# {'name': '橡皮擦', 'age': 18, 'class': 'no1', 'like': 'python'}
【4】元祖推导式和集合推导式
- 其实你应该能猜到,在 Python 中是具备这两种推导式的,而且语法相信你已经掌握了。不过语法虽然差不多
- 但是元组推导式运行结果却不同,具体如下。
my_tuple = (i for i in range(10))
print(my_tuple)
# <generator object <genexpr> at 0x000001D17C9B7DD0>
使用元组推导式生成的结果并不是一个元组,而是一个生成器对象,需要特别注意下
这种写法在有的地方会把它叫做生成器语法,不叫做元组推导式。
集合推导式也有一个需要注意的地方,先看代码:
my_set = {value for value in 'HelloWorld'}
print(my_set)
# {'r', 'o', 'W', 'H', 'l', 'd', 'e'}
- 因为集合是无序且不重复的,所以会自动去掉重复的元素,并且每次运行显示的顺序不一样,使用的时候很容易晕掉。
Python列表字典推导式的更多相关文章
- 周末学习笔记——day02(带参装饰器,wraps修改文档注释,三元表达式,列表字典推导式,迭代器,生成器,枚举对象,递归)
一,复习 ''' 1.函数的参数:实参与形参 形参:定义函数()中出现的参数 实参:调用函数()中出现的参数 形参拿到实参的值,如果整体赋值(自己改变存放值的地址),实参不会改变,(可变类型)如果修改 ...
- python之三元表达式,列表|字典推导式,函数对象
#### 三元表达式: 就是if....else...的语法糖 # -- 1) 只能解决if...else...结构,其他if分支结构都不管 # -- 2)一个分支提供一个结果: 如果一个分支提供了多 ...
- day 14 三元运算符,列表字典推导式,递归,匿名函数,内置函数(排序,映射,过滤,合并)
一.三元运算符 就是if.....else..... 语法糖 前提:if和else只有一条语句 #原始版 cmd=input('cmd') if cmd.isdigit(): print('1') e ...
- Python之字典推导式
推导式是个绝妙的东西,列表推导式一出,map.filter等函数黯然失色,自 Python2.7以后的版本,此特性扩展到了字典和集合身上,构建字典对象无需调用 dict 方法. bad numbers ...
- python的各种推导式(列表推导式、字典推导式、集合推导式)
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解
推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...
- Python中的推导式(列表推导式、字典推导式、集合推导式)
推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...
- 『Python基础-12』各种推导式(列表推导式、字典推导式、集合推导式)
# 『Python基础-12』各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的 ...
- python的推导式 —— 列表推导式、集合和字典推导式
python的推导式是用于快速处理数据的方法. 主要有:列表推导式.集合推导式和字典推导式 import time import numpy as np 列表推导式: 1. 速度快 t1 = time ...
- python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式
闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...
随机推荐
- 6.1 C/C++ 封装字符串操作
C/C++语言是一种通用的编程语言,具有高效.灵活和可移植等特点.C语言主要用于系统编程,如操作系统.编译器.数据库等:C语言是C语言的扩展,增加了面向对象编程的特性,适用于大型软件系统.图形用户界面 ...
- CE修改器入门:查找共享代码
本关我们将学习共享代码,在C语言中角色属性都是以结构体的方式进行存储的,而结构体所存储的信息都是连续性的,这一关我们将会解释如何处理游戏中的共用代码,这种代码是通用在除了自己以外的其他同类型对像上的 ...
- pywin32 实现寻找窗体并模拟按键
import win32api import win32gui, win32con import win32clipboard import re import time class cWindow: ...
- [Java] 解析Xml配置文件
1.解析方法 import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;impo ...
- PCIe诞生20年来最大变革!引入光学传输
PCI-SIG组织官方宣布,已经成立新的光学工作组(Optical Workgroup),研究为PCIe规范引入光学传输接口的可能性. PCIe标准是Intel 2001年提出的,2003年发布1.0 ...
- PHP中的正则表达式相关函数
PHP中的正则表达式相关函数 常用的正则函数 1.执行一个正则表达式匹配 int preg_match ( string pattern , string subject [, array & ...
- 罗克韦尔 FT View使用占位符(全局对象参数)来指定弹出窗口的显示名称
罗克韦尔 FT View使用占位符(全局对象参数)来指定弹出窗口的显示名称 标签占位符 标签占位符能实现将单个图形显示用于多个相似的操作,从而节省开发和维护应用程序的时间. 例如,要为使用同一台机器将 ...
- MyBatis Interceptor
MyBatis的拦截器可以用于在以下对象及方法中拦截修改: Executor (update, query, flushStatements, commit, rollback, getTransac ...
- Spring源码之容器的功能拓展-ApplicationContext
目录 一.解析预备 刷新上下文环境 例如对系统属性或者环境变量进行校验和准备 二.初始化 BeanFactory 并进行 Xml 配置文件的读取 三.对BeanFactory 各种功能填充 四.激活以 ...
- Kafka本地单实例安装
下载安装 从国内镜像站点下载并安装Kafka安装包,以下载并安装v3.2.3版本为例. $ tar -xzf kafka_2.12-3.2.3.tgz $ cd kafka_2.12-3.2.3 启动 ...