推导式(列表、集合、字典):

【列表推导式】:

        表达式一种有两种:

                1.不含条件:[i  for i in 可迭代对象]

                2.含有if条件时:[ 条件满足时的处理 for i in 可迭代对象 if 条件]

            而我们有时候看到第三种的表达方式: [条件为真时的处理 if  条件  else 条件不满足时的处理  for i in 可迭代对象],这是其实是不含条件的衍生。而  条件为真时的处理 if  条件  else 条件不满足时的处理,这种表达方式叫三元运算符:

a=2
if a >3:
    res=True
else:
    res=False
print("第一种方式",res)  ---->输出结果为:第一种方式 False

res2=True if a==2 else False
print("第二种方式",res2)---->输出结果为:第二种方式 True

我们来看看具体的案例

# 不带条件的方式
# 创建一个1-10的列表
li1=[i for i in range(1,11)]



# 带着if 条件的方式
# 如果一个数能被2整除,那么+1,并生成一个新列表
li2= [i+1 for i in li1 if i %2==0]

# 相当于:
"""
li2=[]
for i in li1:
    if i %2==0:
        li2.append(i+1)
"""


# 循环获取之后,进行三元运算的方式
# 奇数+2,偶数+1
li3=[ i+1 if i %2==0 else i +2 for i in li1]

# 相当于
"""
li3=[]
for i in li1:
    if i % 2 == 0:
        li3.append(i + 1)
    else:
        li3.append(i + 2)
"""

print(li1)
print(li2)
print(li3)


输出结果如下:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[3, 5, 7, 9, 11]
[3, 3, 5, 5, 7, 7, 9, 9, 11, 11]

3.双层 for循环:

[表达式 for i in 可循环1 for j in 可循环2]

li1=[1, 3, 5, 7]
li2=["a","b"]
li3=[(x,y) for x in li2 for y in li1]
print(li3)


# 相当于
li4=[]
for i in li2:
    for j in li1:
        li4.append((i,j))
print(li4)


#输出结果如下:li2中的a,跟li1的每一个数组成一个数组;li2中的b,跟li1的每一个数组成一个数组
[('a', 1), ('a', 3), ('a', 5), ('a', 7), ('b', 1), ('b', 3), ('b', 5), ('b', 7)]

拓展内容:

# 将li1和li2组成一个一一对应的字典列表

li1=[1, 3, 5, 7,]
li2=["a","b","c","d"]

# 这个使用了map函数,map函数是把后面两个参数依次提取,然后放到lambda中进行组合成字典
li3=[ i for i in map(lambda x,y:{x:y},li1,li2)]


print(li3)

#得到结果为:
[{1: 'a'}, {3: 'b'}, {5: 'c'}, {7: 'd'}]

集合推导式:

        {表达式  for i in iterable(可迭代对象) if 条件}

        {表达式1 if  条件  表达式2 for i in 可迭代对象}

# 需求:将下列的代码进行去重,并取出对应的偶数

li1=[1, 3, 5, 7,2,4,8,6,1, 3, 5, 7,2,4,8,40]
li3={i for i in li1 if i %2==0}


print(li3)


# 输出结果如下:
{2, 4, 6, 8, 40}

字典推导式:

{ key:value for 循环}

dic3={1: 'a', 3: 'b', 5: 'c', 7: 'd'}

# 互换键值

li4={v:k for k,v in dic3.items()}
print(li4)


# 输出结果:
{'a': 1, 'b': 3, 'c': 5, 'd': 7}




# 案例2:

food=["huoguo","niurou","xiangcai"]
dic1={k+1:v for k,v in enumerate(food)}
print(dic1)


#知识点补充:
enumerate(sequence, [start=0]):
参数1:sequence -- 一个序列、迭代器或其他支持迭代对象。
参数2:start -- 下标起始位置。可不填写,默认为0
# 返回结果:是一个对象,所以需要转为列表,结果为列表嵌套元组,元组内部显示的是每一个元素的下标索引,以及具体的值,如下:


# 输出结果如下:
{1: 'huoguo', 2: 'niurou', 3: 'xiangcai'}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值