2018-02-26 切片操作和生成器

切片操作

python的切片操作是用来访问可迭代对象的,包括字符串和数组,列表等。
我们以数组为例进行介绍

a = [1, 2, 3, 4, 5]
# 访问数组的前3个元素
a[0:3]
[1, 2, 3]

可以看到我们采用a[0:3]的方法很容易的访问到了数组的前三个元素。
对于具有序列结构的数据来说,切片操作的方法是:consequence[start_index: end_index: step]。

start_index:表示是第一个元素对象,正索引位置默认为0;负索引位置默认为 -len(consequence)
end_index:表示是最后一个元素对象,正索引位置默认为 len(consequence)-1;负索引位置默认为 -1。
step:表示取值的步长,默认为1,步长值不能为0。

print(a[-2])
4
a[0::2] # 从第0个元素开始,每隔两个元素取一个元素
[1, 3, 5]
a[-4 : 3] # 从倒数第四个元素到正数第三个元素
[2, 3]
a[-4 : -2] # 从倒数第四个元素到正数第四个元素
[2, 3]

可以看到从杨是从

利用步长对序列进行倒序取值

在切片运算中,步长为正,表示从左至右,按照索引值与起始位置索引之差可以被步长整除的规律取值;当步长为负,则表示从右至左,按照按照索引值与起始位置索引之差可以被步长整除的规律取值。

根据这个特性,我们可以很方便对某个序列进行倒序取值,这个方法比reverse方法更方便,且适用于没有reverse方法的字符串和元组。

print(a[::-1])
[5, 4, 3, 2, 1]
a[::-2] # 从最后一个元素开始,每两个元素取一个
[5, 3, 1]

列表生成式

列表生成式是python中非常好用的一个语法糖,很多时候可以大大的简化代码,让代码更加容易阅读和理解。是Python内置的非常简单却强大的可以用来创建list的生成式。举个例子,要生成list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]可以用range(1, 11):

list(range(1, 11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

但如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么做?方法一是循环:

demolist = []
for x in range(1, 11):
    demolist.append(x * x)
demolist
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的list:

[x * x for x in range(1, 11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

写列表生成式时,把要生成的元素x * x放到前面,后面跟for循环,就可以把list创建出来,十分有用,多写几次,很快就可以熟悉这种语法。

for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:

 [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]

还可以使用两层循环,可以生成全排列:

 [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']

在涉及到列表操作的时候,列表生成式是非常方便的,举个简单的例子,举个例子我们要找出1到100中所有3的倍数:

L = []
for x in range(100):
    if x % 3 == 0:
        L.append(x)
print(L)
    
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
# 而如果用列表生成式就简单多了
print([x for x in range(100) if x % 3 == 0])
# 代码的可读性高,只要一行代码就能够完成四行代码的工作
# 在比如找出100以内所有3或者7的倍数
print([x for x in range(100) if x % 3 == 0 or x % 7 == 0])
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]
[0, 3, 6, 7, 9, 12, 14, 15, 18, 21, 24, 27, 28, 30, 33, 35, 36, 39, 42, 45, 48, 49, 51, 54, 56, 57, 60, 63, 66, 69, 70, 72, 75, 77, 78, 81, 84, 87, 90, 91, 93, 96, 98, 99]

绝大部分用到循环的地方,都可以用列表生成式来简化代码,列表生成式是python中非常强大的工鞥呢。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,324评论 19 139
  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,735评论 0 38
  • 最近在写个性化推荐的论文,经常用到Python来处理数据,被pandas和numpy中的数据选取和索引问题绕的比较...
    shuhanrainbow阅读 10,023评论 6 19
  • 基础篇NumPy的主要对象是同种元素的多维数组。这是一个所有的元素都是一种类型、通过一个正整数元组索引的元素表格(...
    oyan99阅读 10,542评论 0 18
  • 【每天一句正能量】 勇士搏出惊涛骇流而不沉沦,懦夫在风平浪静也会溺水。 有一句话说:你不理解现在的我,是因为不了解...
    点点成长之路阅读 3,564评论 4 2