Python学习日志2——列表生成式和列表推导式


前言

本文我们来介绍两种十分有趣的python玩法,分别是列表推导式和列表生成式。注意:在本文中为了方便大家对代码的运行结果有一个直接认识,所以本文会将部分代码的运行结果以 “==>” 的形式给出。


一、列表推导式

1、为什么使用列表推导式

列表推导式为我们提供了一种从序列创建列表的简单途径,它书写简单,执行效率比循环高。下面我们通过代码直观的感受一下列表推导式的魅力。

  1. 直接从序列中构建列表
    代码示例:
lst=[]
for i in range(5):
    lst.append(i)
  1. 使用列表推导式
    代码示例:
lst=[i for i in range(5)]

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)让每个元素执行相同的操作

例如在此处我们以strip函数为例:
代码示例:

some_animals=[' dog','cat  ',' sheep ']
print([i.strip() for i in some_animals])          ==>['dog','cat','sheep']

(3)加入嵌套循环

代码示例:

test_1=[1,2,3]
test_2=[4,5,6]
print([x*y for x in test_1 for y in test_2])      ==>[4,5,6,8,10,12,12,15,18]
print([[x,x+y] for x in test_1 for y in test_2])  ==>[[1, 5], [1, 6], [1, 7], [2, 6], [2, 7], [2, 8], [3, 7], [3, 8], [3, 9]]
###  注意通过这两个print体会谁是内层循环,谁是外层循环
print([test_1[i]*test_2[i] for i in range(len(test_1))])    ==>[4, 10, 18]
print([x*y for x,y in zip(test_1,test_2)])                  ==>[4, 10, 18]

(4)实现行列转换

代码示例:

test=[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
print([[row[i] for row in test] for i in range(len(test[0])))
==>[[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

(5)加入判断条件,组成过滤器

例如,从一个给定的列表中选出偶数组成一个新的列表
代码示例:

test=[1,2,3,4,5,6]
print([x for x in test if x%2==0])            ==>[2, 4, 6]
print(list(filter(lambda x:x%2==0,test)))     ==>[2, 4, 6]

filter 是Python中的一个内嵌函数,它有两个参数,其中第一个参数是一个函数,第二个参数是一个迭代器,返回值是布尔类型,它的作用是将迭代器中的每一个元素都用第一个函数进行判断,为真则保留,反之则去除,从而也形成了过滤的作用。
如果此处对lambda表达式有疑惑,不妨可以看看有关函数中对lambda表达式的介绍。学习日志1 函数
例如,判断列表中有几个对称数
代码示例:

test=[1221,1234,12321,14441,15672]
print(sum([num==num[::-1] for num in map(str,test)]))    ==> 3
print(len([num for num in map(str,test) if num==num[::-1]]))   ==>3

二、列表生成式

只需要将列表推导式中的中括号改成小括号就变成了生成式。

1.与推导式的区别:

  • 列表推导式一次性返回所有的元素,生成式每次只会返回一个元素
  • 当生成的元素数量非常多时,生成式占用的空间非常小,而推导式则会占用大量的空间
  • 推导式的执行效率高,所以推荐在数据量小的时候使用

2.一些样例

代码示例:

test=[1,2,3]
print((i*i for i in test))              ==><generator object <genexpr> at 0x0000026B4E6C0D60>
print(list(i*i for i in test))          ==>[1, 4, 9]          
print(([i,i+2] for i in test))          ==><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

总结

以上就是本篇文章的全部内容了,在本篇文章中我们着重讲解了关于从一个序列中生成列表表达式的简单方法,并且给出了相关的一些用法,希望通过本文大家可以掌握列表推导式和列表生成式的基本用法。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值