python列表推导式、集合推导式和字典推导式

列表推导式(List comprehensions)

通过列表推导式我们能更方便简洁地创建列表,一般是对序列(字符串、列表、元组)或者是可迭代对象(py3中range()返回就是可迭代对象)中的元素进行某些操作来生成新的列表。

假如我们想快速创建一个包含0到5的平方值的列表,我们可以:

squares = []
for x in range(6):    #循环添加元素
    squares.append(x**2)
print(squares)      #[0, 1, 4, 9, 16, 25]

或者我们可以选择更简洁也更易读的方式:

squares = [x**2 for x in range(6)]  #直接使用列表推导式
print(squares)      #[0, 1, 4, 9, 16, 25]

当然,通过列表推导式我们还可以有更多操作:

vec = [-4, -2, 0, 2, 4]  #创建一个列表

#筛选出vec列表中所有大于0的元素
print([x for x in vec if x > 0])   #[2, 4]

#对vec列表每个元素应用函数,此处为求绝对值
print([abs(x) for x in vec])   #[4, 2, 0, 2, 4]

#为列表每个元素调用方法,此处为转换字母小写
freshfruit = ['baNana', 'loGANberRY ', 'pAssiON fRUIT']
print([fruit.lower() for fruit in freshfruit])   
#输出:['banana', 'loganberry ', 'passion fruit']

#生成两个列表中不相等元素可以组成的所有对的列表
print([(x, y) for x in [1,2,3] for y in [3,1,4] if x != y])   
#输出:[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

此外,我们还可以通过嵌套列表推导式来进行一些操作:

#构造一个二维列表模拟二维数组
matrix = [[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12]]
#通过嵌套列表推导式来进行
print([ [row[i] for row in matrix] for i in range(len(matrix[0])) ])
#[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

总结:使用列表推导其实很简单,记住框架然后灵活使用即可。值得注意的是每个部分之间的的空格必不能少。
个人归纳的语法框架(仅供参考):[对单个元素的操作 for 单个元素 in 原始序列 if 筛选条件]


集合推导式

集合推导式和列表推导式极其相似,用法也完全一样,唯一的区别就在于将代表列表的符号[ ]替换成代表几个的符号{ }

vec = [-4, -2, 0, 2, 4]  #创建一个列表

#筛选出vec列表中所有大于0的元素,结果为列表
print([x for x in vec if x > 0])   #[2, 4]
#筛选出vec列表中所有大于0的元素,结果为集合
print({x for x in vec if x > 0})   #{2, 4}

#对vec列表每个元素求绝对值,结果为列表
print([abs(x) for x in vec])   #[4, 2, 0, 2, 4]
#对vec列表每个元素求绝对值,结果为集合
print({abs(x) for x in vec})   #{0, 2, 4}  注意此处的集合自动去重

总结:要注意的只有一点,使用集合推导式的返回结果会自动去重。


字典推导式

通过上面的介绍,大概可以猜出来字典推导式该怎么用了,直接来试试吧:

#生成以x为键,x平方为值的字典
print({x: x**2 for x in (2, 4, 6)})
#输出:{2: 4, 4: 16, 6: 36}

#快速将两个关联的列表以键值对的形式生成字典
names = ['trophy','jack','bob']
ages = [19,21,23]
print({name:age for (name, age) in zip(names,ages)})
#输出:{'trophy': 19, 'jack': 21, 'bob': 23}

参考:python官方文档(英文)

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值