一.列表推导式

通过一行循环判断,遍历出一系列数据的方式就是推导式

特点:方便,简洁,可以实现一些简单的功能
推导式当中只能跟循环和判断(单项分支)
种类分为三种: 列表推导式  集合推导式  字典推导式

1.推导式内容讲解

#(1) 基本语法
#例:

#[1,2,3,4] => [2,4,6,8]
lst = [1,2,3,4]
lst2 = []
for i in lst:
    res = i * 2
    lst2.append(res)
print(lst2)

res = [i for i in range(1,5)]

print(res)

#[1, 2, 3, 4]

#改写
res2 = [i*2 for i in range(1,5)]
print(res2)
[2, 4, 6, 8]

#[1,2,3,4] => [2,8,24,64]
'''

解析:
1 ->2  乘以2的1次幂
2 ->8  乘以2的2次幂
3 ->24 乘以2的3次幂
4 ->64 乘以2的4次幂
'''

#把想要的值 写在for的左侧
res = [i<<i for i in range(1,5)]  # 1<<1   2<<2   3<<3  4<<4
print(res)

#(2)带有条件判断的推导式
#例:

lst = [1,2,3,4,5,6,67,7,8,98,9]
lst2 = []
for i in lst:
    if i % 2 == 0:
        lst2.append(i)
print(lst2)

#推导式写法
res = [ i for i in lst if i % 2 == 0 ]
print(res)

#(3)多循环推导式
#例:

lst1 = ["one","two","three","four"]
lst2 = ["five","six","seven","eight"]
lst = []
for i in lst1:
    for j in lst2:
        res = i +"♥♥♥"+j
        lst.append(res)
print(lst)

res = [ i +"♥♥♥"+j for i in lst1 for j in lst2 ]
print(res)
#效果为:

['one♥♥♥five', 'one♥♥♥six', 'one♥♥♥seven', 'one♥♥♥eight', 'two♥♥♥five', 'two♥♥♥six', 'two♥♥♥seven', 'two♥♥♥eight', 'three♥♥♥five', 'three♥♥♥six', 'three♥♥♥seven', 'three♥♥♥eight', 'four♥♥♥five', 'four♥♥♥six', 'four♥♥♥seven', 'four♥♥♥eight']

#分析,one循环4次才到下一个元素

#(4)带有判断条件的多循环推导式
#例:

lst1 = ["one","two","three","four"]
lst2 = ["five","six","seven","eight"]
lst_new = []
for i in lst1:
    for j in lst2:
        if lst1.index(i) == lst2.index(j) :
            strvar = i + '♥♥♥' + j
            lst_new.append(strvar)
print(lst_new)

#推导式方式实现:
res = [ i + '♥♥♥' + j for i in lst1 for j in lst2 if lst1.index(i) == lst2.index(j)]
print(res)

#在循环内加一个元素索引相等的判断:lst1.index(i) == lst2.index(j)

#结果为:

['one♥♥♥five', 'two♥♥♥six', 'three♥♥♥seven', 'four♥♥♥eight']

2.推导式练习题

#(1){'x': 'A', 'y': 'B', 'z': 'C' } 把字典写成x=A,y=B,z=C的列表推导式
dic = {'x': 'A', 'y': 'B', 'z': 'C' }
# for a,b in dic.items():
#     print(a,b)
res = [a+"="+b for a,b in dic.items()]
print(res)

#(2)把列表中所有字符变成小写  ["ADDD","dddDD","DDaa","sss"]
lst = ["ADDD","dddDD","DDaa","sss"]
res = [i.lower() for i in lst]
print(res)

#(3)x0-5之间的偶数,y0-5之间的奇数,x,y组成一起变成元祖,放到列表当中
#分析:
# (0 2 4)
# (1 3 5)
# (0 1) (0 3) (0 5)
# (2 1) (2 3) (2 5)
# (4 1) (4 3) (4 5)
lst_new = []
for i in range(0,6):
    if i % 2 == 0:
        for j in range(0,6):

   if j %2 == 0:

lst_new.append((i,j))
print(lst_new)

#写法一:
res = [(i,j) for i in range(0,6) if i % 2 == 0 for j in range(0,6) if j % 2 == 1]
print(res)
lst_new2 = []
for i in range(0,6):
    for j in range(0,6):
        if i % 2 == 0 and j % 2 == 1:
            lst_new2.append((i,j))
print(lst_new2)

#写法二:推导式方式表达
res = [(i,j) for i in range(0,6) for j in range(0,6) if i % 2 == 0 and j % 2 == 0]
print(res)

#(4)使用列表表达式 制作99乘法表的运算
#普通方法:

for i in range(1,10):
    for j in range(1,i+1):
        # print("%d*%d=%2d " % (i,j,i*j))
        print("{:d}*{:d} ={:2d}".format(i,j,i*j),end="")
    print()

#写法一:推导式表达
res = ["{:d}*{:d} ={:2d}".format(i,j,i*j) for i in range(1,10) for j in range(1,i+1)]
print(res)

#普通方法:
for i in range(9,0,-1):
    for j in range(1,i+1):
        # print("%d*%d=%2d " % (i,j,i*j))
        print("{:d}*{:d} ={:2d}".format(i,j,i*j),end="")
    print()

#写法二:推导式表达
res = ["{:d}*{:d} ={:2d}".format(i,j,i*j) for i in range(9,0,-1) for j in range(1,i+1)]
print(res)
(5)#M,N中矩阵和元素的乘积
# M = [ [1,2,3], 
#       [4,5,6], 
#       [7,8,9]  ] 
# N = [ [2,2,2], 
#       [3,3,3], 
#       [4,4,4]  ] 
=>实现效果1   [2, 4, 6, 12, 15, 18, 28, 32, 36]
=>实现效果2   [[2, 4, 6], [12, 15, 18], [28, 32, 36]]
M = [[1,2,3],[4,5,6],[7,8,9]]
N = [[2,2,2],[3,3,3],[4,4,4]]
#分析:
#M[0][0]*N[0][0] = 2
#M[0][1]*N[0][1] = 4
#M[0][2]*N[0][2] = 6
#

#M[1][0]*N[1][0] = 12
#M[1][1]*N[1][1] = 15
#M[1][2]*N[1][2] = 18

#M[2][0]*N[2][0] = 28
#M[2][1]*N[2][1] = 32
#M[2][2]*N[2][2] = 36

#效果1 #i => 0 1 2 j => 0 1 2 i动的慢 j 动的快
res = [M[i][j]*N[i][j] for i in range(3) for j in range(3)]
print(res)

#=> 效果2 [ [2,4,6] , [12,15,18], [28,32,36]  ]
# [] [] []
'''

分析:
第一步遍历三个空列表
[[] for i in rang(3)]

第二步 空列表里面写一个推导式对于的元素
[M[i][j]*N[i][j] for j in rang(3)]

'''
res =[ [M[i][j]*N[i][j] for j in range(3)] for i in range(3)]
print(res) #[[2,4,6] [] []]

3.

二.集合推导式

例:
   满足年龄在18到21,存款大于等于5000 小于等于5500的人,
   开卡格式为:尊贵VIP卡老x(姓氏),否则开卡格式为:抠脚大汉卡老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}
]
#res = {'a':1,'b':2}
#for i in res:
#    print(i)

setvar = set()
for i in listvar:
    if 18<=i['age'] <=21 and 5000 <i['money'] <= 5500:
        strvar = '尊贵VIP卡老' + i["name"][0]
        setvar.add(strvar)
    else:
        strvar = '抠脚大汉卡老' + i['name'][0]
        setvar.add(strvar)
print(setvar)

#真值 if 条件表达式 else 假值
#第一部分 for i in listvar
#第二部分 三目运算 : "尊贵VIP卡老" + i["name"][0] if 18 <= i['age']<=21 and 5000<=i['money']<=5500 else "抠脚大汉卡老" + i['name'][0]

res = {"尊贵VIP卡老" + i['name'][0] if 18 <= i['age'] <= 21 and 5000 <=i['money'] <=5000 else "抠脚大汉卡老" + i['name'][0] for i in listvar}
print(res)

三.字典推导式

1.enumerate

enumerate(iterable,[start=0])
功能: 枚举 ; 将所有引号和iterable中的值,一个个拿出来配对组成元组放入迭代器中
参数:
    iterable : 可迭代性数据(常用:迭代器,容器类型数据,可迭代对象range)
    start:     可以选择开始的索引号(默认从0开始索引)
返回值: 迭代器
listvar = ["one","two","three","four"]
it = enumerate(listvar)
from collections import Iterable,Iterator
print(isinstance(it,Iterator))
#(1)使用next进行调用
res = next(it)
print(res)
res = next(it)
print(res)

#(2) 使用for来调用
for i in it:
    print(i)

#(3)list 瞬间得到所有数据
it = enumerate(listvar)
lst = list(it)
print(lst)  #[(0, 'one'), (1, 'two'), (2, 'three'), (3, 'four')]

#利用enumerate变成字典推导式
res = {a:b for a,b in enumerate(listvar)}
print(res)

#使用dict强转迭代器
res = dict(enumerate(listvar))
print(res)

2.zip

功能:将多个iterable中的值,一个一个拿出来配对组成元组放入迭代器中
iterable:可迭代性数据(常用:迭代器,容器类型数据,可迭代对象range )
返回:迭代器
#(1) zip自动配对,如果长度超出了,自动舍弃
lst1 = ["one","two","three","four"]
lst2 = ["英俊潇洒","疯牛踢躺","柔情似水","抠脚大汉",1,2,3,4]
it = zip(lst1,lst2)
print(isinstance(it,Iterator))

#使用for 搭配next进行调用
for i in range(3):
    res = next(it)
    print(res)

for i in it:
    print(i)

#利用zip实现字典推导式
res = {a:b for a,b in zip(lst1,lst2)}
print(res)

#使用dict强转迭代器
res = dict(zip(lst1,lst2))
print(res)

#(2) 用两个列表,实现如下字典:
# 'xd':'熊大'
# 'xe':'熊二'
# 'gtq':'光头强'
dic1 = {'xd':"傻乎乎","xe":"呆呼呼","gtq":"光头"}
dic2 = {0:"熊大",1:"熊二",2:"光头强"}

lst_keys = dic1.keys()
#print(lst_keys)
#print(isinstance(lst_keys,Iterator))
#print(isinstance(lst_keys,Iterable))
lst_values = dic2.values()
print(lst_values)
#print(isinstance(lst_values,Iterable))
#print(isinstance(lst_values,Iterator))

it = zip(lst_keys,lst_values)
print(it)

#使用字典推导式实现
res = {a:b for a,b in it}
print(res)

#使用dict强转迭代器实现
it = zip(lst_keys,lst_values)
res = dict(it)
print(res)

Python 基础之推导式的更多相关文章

  1. python基础——列表推导式

    python基础--列表推导式 1 列表推导式定义 列表推导式能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形 2 列表推导式语法 基本格式如下: [expr for va ...

  2. Python基础-列表推导式

    python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...

  3. Python基础-列表推导式、匿名函数、os/sys/time/datetime/pymysql/xlwt/hashlib模块

    列表推导式 [表达式 for 变量 in range(n) if 条件]  等效于 for 变量 in in range(n): if 条件: 表达式 优点:书写方便,缺点:不易读 注意:用的是方括号 ...

  4. Python基础---三大推导式

    推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据结构构建另一个新的数据结构的结构体. 共有三种推导,在Python2和3中都有支持: 列表(lis ...

  5. python 基础(六) 推导式

    列表推导式 概念:提供了一种创建列表的简单快速的途径 (1) 一般形式 myList = [x for x in range(10)] ​ #分解后 myList = [] for x in rang ...

  6. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  7. python的各种推导式

    python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...

  8. python 3列表推导式的的一点理解!

    python 3列表推导式的的一点理解! Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式, ...

  9. Python 入门之 推导式

    Python 入门之 推导式 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1.推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i f ...

随机推荐

  1. Java 倒入文章显示前n个单词频率

    package com_1; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOExc ...

  2. ACL与OSPF综合实验

    OSPF与ACL 综合实验   拓扑图如下: 分析: 配置基本配置: R1: R2: R3: 2.配置OSPF: R1: R2: R3: IT: 设置IT的ip 并划分到ospf2区域 3.配置ACL ...

  3. falsk 使用celery后台执行任务

    # falsk 使用celery后台执行任务 1.基础环境搭建 doc:https://flask.palletsprojects.com/en/1.0.x/patterns/celery/ mkdi ...

  4. animate使用方法

    链接:https://www.cnblogs.com/xiaohuochai/p/7372665.html

  5. python学习之网路操作

    socket:服务器与客户端的常规操作,但默认创建的的sever.socket是阻塞式,不支持多个客户端的连接,要想连接多个客户端需要引入多线程.但对于IO类型来说大部分时间其实都在IO上与创建多个线 ...

  6. 【PAT甲级】1090 Highest Price in Supply Chain (25 分)

    题意: 输入一个正整数N(<=1e5),和两个小数r和f,表示树的结点总数和商品的原价以及每向下一层价格升高的幅度.下一行输入N个结点的父结点,-1表示为根节点.输出最深的叶子结点处购买商品的价 ...

  7. jQuery中$("input")与$(":input")的区别

    $("input")表示获取页面所有的input元素 $(":input")选取表单中所有的input,select 和 button元素

  8. 5_5 集合栈计算机(UVa12096)<stack与STL其他容器的综合运用>

    有一个专门为了集合运算而设计的“集合栈”计算机.该机器有一个初始化为空的栈,并支持以下操作:( 维护 N(1≤N≤2000) 个操作, 可能的五种操作如下:) ■PUSH: 在栈顶加入一个空集合 A= ...

  9. SqlHelper类编写前奏:DataReader关闭链接出现问题

    SqlHelper是一个执行数据库操作的助手类,但是当我们没学过DataSet之前,要想使用using搭配SqlConnection和SqlCommand写出一个真正独立的SqlHelper都是不太可 ...

  10. Linux 目录结构与目录操作

    目录结构 Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录"/",然后再次目录下再创建其他目录 在Linux系统中,一切皆文件 常见目录作用 / : 所有 ...