吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3216|回复: 32
收起左侧

[Python 转载] Python语法之列表生成式的13个练习题

   关闭 [复制链接]
OVVO 发表于 2022-9-18 15:36

概述

列表生成式是Python内置的非常简单却强大的可以用来创建list的生成式。

Python 列表推导式是什么

列表推导式是 Python 语言特有的一种语法结构,也可以看成是 Python 中一种独特的数据处理方式,
它在 Python 中用于 转换 和 过滤 数据。

其语法格式如下所示,其中 [if 条件表达式] 可省略。

变量 = [表达式 for 迭代变量 in 可迭代对象 [if 条件表达式]]
variable = [out_exp for var in iterable if condition]

下面通过例题来对列表生成式进行深入的理解。

例题1:生成一个由1-10的平方组成的列表

列表元素分别为[1×1,2×2,3×3,......n×n],假设n=10

常规方法

alist = []
for i in range(1, 11):
    alist.append(i * i)

print(alist)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

列表生成式

alist = [i * i for i in range(1, 11)]
print(alist)
# [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

例题2:接着上一个需求,要求返回的序列中不存在偶数项

常规方法

alist = []
for i in range(1, 11):
    if i % 2 != 0:
        alist.append(i * i)

print(alist)
# [1, 9, 25, 49, 81]

列表生成式

alist = [i * i for i in range(1, 11) if i % 2 != 0]
print(alist)
# [1, 9, 25, 49, 81]

例题3:字符串s1='ABC',字符串s2='123',要求:生成序列 A1 A2 A3 B1 B2 B3 C1 C2 C3

常规方法

alist = []
for i in 'ABC':
    for j in '123':
        alist.append(i + j)
print(alist)
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

列表生成式

alist = [i + j for i in 'ABC' for j in '123']
print(alist)
# ['A1', 'A2', 'A3', 'B1', 'B2', 'B3', 'C1', 'C2', 'C3']

例题4:将3×3的矩阵alist1转换成一个列表,且使该列表中包含偶数

常规方法

alist1 = [[1,2,3],[4,5,6],[7,8,9]]
alist2 = []
for item1 in alist1:
    for item2 in item1:
        if item2 % 2 == 0:
            alist2.append(item2)
print(alist2)
# [2, 4, 6, 8]

列表生成式

alist1 = [[1,2,3],[4,5,6],[7,8,9]]
alist2 = [item2 for item1 in alist1 for item2 in item1 if item2 % 2 == 0]
print(alist2)
# [2, 4, 6, 8]

例题5:if else 的情况

常规方法

alist = []
for i in range(10):
    if i % 2 == 0:
        alist.append(i)
    else:
        alist.append(1)
print(alist)
# [0, 1, 2, 1, 4, 1, 6, 1, 8, 1]

列表生成式

alist = [i if i % 2 == 0 else 1 for i in range(10)]
print(alist)
# [0, 1, 2, 1, 4, 1, 6, 1, 8, 1]

例题6:当我们想要得到需要循环才能实现的内容时:输出1-10的各个数的对应次方的值。1的1次方,2的2次方,3的3次方…

常规方法

for i in range(1, 10):
    print(i ** i)
    # 1
    # 4
    # 27
    # 256
    # 3125
    # 46656
    # 823543
    # 16777216
    # 387420489

列表生成式

print([i ** i for i in range(1, 10)])
# [1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489]

例题7:找出1-10之间所有的偶数,并返回一个列表(包含以这个偶数为半径的圆的面积)

常规方法

import math

li = []
for i in range(1, 10):
    if i % 2 == 0:
        li.append(math.pi * i * i)
print(li)
# [12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676]

列表生成式

import math

print([math.pi * i * i for i in range(1, 10) if i % 2 == 0])
# [12.566370614359172, 50.26548245743669, 113.09733552923255, 201.06192982974676]

例题8:现在有一个字典d = {‘手机’: 2000, ‘电脑’: ‘4000’, ‘鼠标’: ‘100’ },如何 以 手机=2000,电脑=4000,鼠标=100的形式展示。

常规方法

d = {'手机': 2000, '电脑': '4000', '鼠标': '100'}
li = []
for k, v in d.items():
    li.append(k + "=" + str(v))
print(li)
# ['手机=2000', '电脑=4000', '鼠标=100']

列表生成式

d = {'手机': 2000, '电脑': '4000', '鼠标': '100'}
print([k + "=" + str(v) for k, v in d.items()])
# ['手机=2000', '电脑=4000', '鼠标=100']

例题9:取出所有带a的列表

常规方法

list1 = ['52pojie', 'OVVO', 'asd', 'sdf', 'freg', 'sfag', 'refv', 'aser', 'sdfr']
rs_list = []
for s in list1:
    if 'a' in s:
        rs_list.append(s)
print(rs_list)
# ['asd', 'sfag', 'aser']

列表生成式

list1 = ['52pojie', 'OVVO', 'asd', 'sdf', 'freg', 'sfag', 'refv', 'aser', 'sdfr']
list2 = [x for x in list1 if 'a' in x]
print(list2)
# ['asd', 'sfag', 'aser']

例题10:多重循环

常规方法

k = []
for i in range(4):
    for j in range(2):
        k.append((i, j))
print(k)
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]

列表生成式

print([(i, j) for i in range(4) for j in range(2)])
# [(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]

例题11:求a~d能组成的所有两字符的字符串

常规方法

li = []
for x in range(97, 101):
    for y in range(97, 101):
        li.append(chr(x) + chr(y))
print(li)
# ['aa', 'ab', 'ac', 'ad', 'ba', 'bb', 'bc', 'bd', 'ca', 'cb', 'cc', 'cd', 'da', 'db', 'dc', 'dd']

列表生成式

result = [chr(x) + chr(y) for x in range(97, 101) for y in range(97, 101)]
print(result)
# ['aa', 'ab', 'ac', 'ad', 'ba', 'bb', 'bc', 'bd', 'ca', 'cb', 'cc', 'cd', 'da', 'db', 'dc', 'dd']

例题12:列表推导式可以实现矩阵的转置

常规方法

a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
li = []
for i in range(4):
    l2 = []
    for row in a:
        l2.append(row[i])
    li.append(l2)

print(li)
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

列表生成式

a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
at = [[row[i] for row in a] for i in range(4)]
print(at)
# [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

例题13:【自己动手】画Love组成的心型代码

在这里插入图片描述
好了,通过以上的例子你应该对列表生成式有了大致的了解,请把以下【列表生成式】语法改成【常规方法】并发到评论区

print('\n'.join([''.join([('OVVO'[(x-y) % len('OVVO')]if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ')for x in range(-30, 30)])for y in range(30, -30, -1)]))

免费评分

参与人数 6吾爱币 +6 热心值 +3 收起 理由
menoooooos + 1 + 1 我很赞同!
zhaoqingdz + 1 谢谢@Thanks!
我的睡公主 + 1 + 1 我很赞同!
yjn866y + 1 + 1 谢谢@Thanks!
fxsh252 + 1 我很赞同!
hecoter + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

AmazingBoy 发表于 2023-11-15 18:13
你好,请教一下,有没有一款软件可以在iPad上运行Python的代码,且可以做到电脑和iPad之间代码的自动同步?因为MATLAB可以,所以想问一下Python可以吗?百度目前没查出来
YihangZhu 发表于 2023-11-13 16:31
python的列表生成式能够花式组合出各种效果,非常适用于遍历操作,唯一的问题就是牺牲了部分可读性
arq2020 发表于 2022-9-18 16:19
82813668 发表于 2022-9-18 16:49
学习了很多
yjn866y 发表于 2022-9-18 17:56
谢谢分享,学习了
sr0630 发表于 2022-9-18 20:12
挺好的,刚在整理
我的睡公主 发表于 2022-9-18 20:33
学习了,谢谢
cp99 发表于 2022-9-18 22:21
先收藏,学习一下
c0co123 发表于 2022-9-19 00:18
MARK,有用,学习
zhaoqingdz 发表于 2022-9-19 10:57
感谢楼主的分享,本人正在学习python!
daymissed 发表于 2022-9-19 14:21
对我这样新手还是挺好的,感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-28 00:04

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表