前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一行代码的优雅| Python列表生成式

一行代码的优雅| Python列表生成式

作者头像
生信菜鸟团
发布2020-06-04 10:07:06
3.2K0
发布2020-06-04 10:07:06
举报
文章被收录于专栏:生信菜鸟团

列表是Python中非常常见的数据结构,在基础课中也占了不小的篇幅。今天的推送就列表相关的内容再整理。

列表是包含有索引的元素集,其中的元素可由字符、数字、字符串及子列表组成,用 list = []表示。基本操作包括:

  1. 增加元素 list.append(obj) 在列表末尾添加新的元素 list.insert(index,obj) 能够在列表任意位置添加新的元素。
  2. 删除元素 list.pop(index) 移除索引位置的元素,同时会返还被移除元素的值。 del list[index] 移除移除索引位置的元素,但不返回移除元素的值,注意中间是空格。 list.remove(obj) 移除第一个匹配到的元素。
  3. 修改元素 list[index] = obj
  4. 查找元素 list.index('obj')
  5. 列表排序 sort(list) 永久性排序。 temp_list = sorted(list) 返回一个新建的已排序列表。 list.sort(reverse=Ture) 反向排序。
  6. 列表切片 list[start:end:step] 切片是支持步长选择的。

嵌套列表的使用

嵌套的列表可以用来表示表格或数学上的矩阵,可以用于记录多维的数据,但是需要注意的是,嵌套列表不能够使用以下的方式生成:

代码语言:javascript
复制
scores = [[0] * 3] * 5
print(scores)    # [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
代码语言:javascript
复制
# 嵌套的列表需要多次索引操作才能获取元素

正确的方式如下(生成式):

代码语言:javascript
复制
scores = [[0] * 3 for _ in range(5)]
scores[0][0] = 95
print(scores)    # [[95, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

示例图如下:

第011课:常用数据结构之列表

列表生成式

代码语言:javascript
复制
[exp for iter_var in iterable]

生成式中,首先会将可迭代对象iterable中的每个元素的结果赋值给iter_var,然后通过exp得到一个新的计算值;最后把所有通过exp得到的计算值以一个新列表的形式返回。也就是与下列语句同效:

代码语言:javascript
复制
L = []
for iter_var in iterable:
    L.append(exp)

类似的,还有以下两种可使用的方式:

代码语言:javascript
复制
#带过滤功能语法格式
[exp for iter_var in iterable if_exp]

#循环嵌套语法格式
[exp for iter_var_A in iterable_A for iter_var_B in iterable_B]

也就是在之前的基础上,添加判断条件或嵌套循环。

例如,过滤出一个指定的数字列表中值大于20的元素

代码语言:javascript
复制
L = [3, 7, 11, 14,22, 33, 26, 57, 99]
# 不使用列表生成式实现
list_new = []
for x in L:
    if x < 20:
        list_new.append(x)

# 使用列表生成式实现
list_newi = [x for x in L if x > 20]

再来一个例子:把一个列表中所有的字符串转换成小写,非字符串元素移除

代码语言:javascript
复制
L = ['TOM', 'Peter', 10, 'Jerry']
# 用列表生成式实现
list1 = [x.lower() for x in L if isinstance(x, str)]

# 用map()和filter()函数实现
list2 = list(map(lambda x: x.lower(), filter(lambda x: isinstance(x, str), L)))

我们在之前推送中聊过这类 map()和filter() 高阶函数的简单用法,高阶函数的英文为 Higher-order function ,怎么理解呢。我们从内置函数再来理解一下上面的提及到的函数名定义规则与变量一致,换句话说函数名也可以认为是一个变量。

那么,既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

高阶函数,我们以 map(f,list) #对列表内元素逐个处理,举个栗子:

代码语言:javascript
复制
# 对每一个元素进行平方计算
def f(x):
    return x*x

for i in map(f,[1,2,3,4,5,6,7]):
    print(i)

# 使用正则取列表中所有元素的关键字,省略部分代码
import re
def id(x):
    return re.findall(r'ORF\d+_(.*?):',x)[0]

for line in f:
    if line.startswith('P'):
        line = line.split('\t')
        line1 =list(map(id,line))
        print(line1)

比较来看,对于大部分需求来讲,使用列表生成式和使用高阶函数都能实现。这对于那些元素数量很大或无限的可迭代对象来说显然是更合适的,因为可以避免不必要的内存空间浪费。

enumerate函数

遍历列表时,课程中有一个函数值得关注 enumerate,该函数在循环遍历时会取到一个二元组,解包之后第一个值是索引,第二个值是元素,下面是一个简单的对比。

代码语言:javascript
复制
items = ['Python', 'Java', 'Go', 'Swift']

for index in range(len(items)):
    print(f'{index}: {items[index]}')

for index, item in enumerate(items):
    print(f'{index}: {item}')

第013课:列表和元组的应用

终于梳理了生成式的一些用法,同时从比较中引申出不同方法实现相同目的的用法,希望对你有启发~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信菜鸟团 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 列表生成式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档