• Python学习入门基础教程(learning Python)--6.3 Python的list切片高级


         上节"6.2 Python的list访问索引和切片"主要学习了Python下的List的访问技术:索引和切片的基础知识,这节将就List的索引index和切片Slice知识点做进一步的展开。

          0.index必须大于0么?

          list数据类型通过index访问某项数据项时,其index的值可以取负值,-1代表list列表最后一项数据,-2代表倒数第二项数据,以此类推。

    >>> li1 = range(10)
    >>> li1
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    >>> li1[-1]
    9
    >>> li1[0:-2]
    [0, 1, 2, 3, 4, 5, 6, 7]
    >>> li1[-len(li1):-1]
    [0, 1, 2, 3, 4, 5, 6, 7, 8]

          1.slice步长

          Python里的List数据类型在使用的时候,通常给出start和stop位置,比较常见。实际上List的Slice的标准语法规则应该是:

    list_obj[start:stop:step]

           这里的step是步长的意思。上边的意思是从start位置开始取数据,一直到stop-1这个位置结束,每隔step个数据项取一个数据。如果不指定step值,Python一般默认为+1。

    >>> li1 = range(50)
    >>> li1
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]
    >>> li2 = li1[::5]
    >>> li2
    [0, 5, 10, 15, 20, 25, 30, 35, 40, 45]
    >>> li3 = li1[4:49:3]
    >>> li3
    [4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46]
    >>> 

          上边代码第4行,li2列表的数据项是从li1里取得,以什么样的方式从li1里取呢?从li1的第0项数据开始一直到li1的最后一项结束,是全部都取回么?不是,从第0项开始,每隔5项数据取一个,所以取回的是0、5、10...45。代码第7行是从li1的第4项数据开始取数据,每隔3项数据取一个数据,所以依次取回第4项、第7项、第10项等数据。

    >>> li4 = li1[4:49:-3]
    >>> li4
    []

          2.步长一定是正数么?

          我们看下边的例子

    >>> li1 = range(50)
    >>> li4 = li1[4:49:-3]
    >>> li4
    []
    >>> li4 = li1[4:49:3]
    >>> li4
    [4, 7, 10, 13, 16, 19, 22, 25, 28, 31, 34, 37, 40, 43, 46]
    >>> li4 = li1[49:4:-3]
    >>> li4
    [49, 46, 43, 40, 37, 34, 31, 28, 25, 22, 19, 16, 13, 10, 7]
    >>> 

          例子说明,step也可以为负数,上边例子比较纠结的地方是代码第2行为何没有数据取回赋值给li4?其实很简单,在取li1时,限定了范围从li1列表的第4项开始取数据,到第48项数据结束,由于step=-3,那取回第一个数据应该是第4-3项数据即li1的第1项数据,但第1项数据不在4:49这个限定范围内,故无法取回数据并赋值给li4,故li4为空列表。理解了第2行的代码后再去理解第7行的代码就容易的多了,第7行的代码的意思从li1的第49项开始取数据,第二次去第49-3=46项的数据,一直取到第4-1=3项数据之间的所有满足条件的数据并赋值给li4。

          3.list逆序

          通过以上对list的start、stop和step的介绍,我们发现list太牛了!可以很轻松的使用list数据类型来完成C语言比较复杂的程序,例如用C语言实现对一个字符串数组的逆序操作,写出这个程序很复杂,如果用Python的list来实现一两行即可搞定!

    >>> str1 = "www.jeapedu.com"
    >>> li1 = list(str1)
    >>> li1
    ['w', 'w', 'w', '.', 'j', 'e', 'a', 'p', 'e', 'd', 'u', '.', 'c', 'o', 'm']
    >>> li2 = li1[-len(li1):-1]
    >>> li2
    ['w', 'w', 'w', '.', 'j', 'e', 'a', 'p', 'e', 'd', 'u', '.', 'c', 'o']
    >>> li3 = li1[-1:-len(li1)]
    >>> li3
    []
    >>> li3 = li1[-1:-len(li1):-1]
    >>> li3
    ['m', 'o', 'c', '.', 'u', 'd', 'e', 'p', 'a', 'e', 'j', '.', 'w', 'w']
    >>> 

          注:step默认情况下为1,len()函数可以测得list数据类型的长度,list()函数可将字符串专为list列表。

          解释一下上边的小程序,代码第2行将str1字符串转换成list列表,并赋值给li1列表,代码第8行的li3为何没有数据呢?因为默认的step=1,在最后一项数据到第一项数据间这个访问内,从list的-1开始每隔1个已经超出了这个访问,故无法取得任何li1的数据项赋值给li3,而代码第11行去li1的范围为从最后一项(-1)开始,每隔负1项(-2、-3、-4...)都在-1到-len(li1)这个范围之内,故可以取回li1的数据项,由于步长绝对值为1,又是从li1最后一项开始取一直取到li1的第0项数据,故此时li3列表是li1列表的逆序列表。

          有牛人说了,你上边的Python程序也太复杂了,Python有更简单的办法实现list的逆序,那就是直接调用Python提供的内建函数reverse(),恩,对!用reverse函数确实更简单!

    >>> li5
    ['m', 'o', 'c', '.', 'u', 'd', 'e', 'p', 'a', 'e', 'j', '.', 'w', 'w', 'w']
    >>> li5.reverse()
    >>> li5
    ['w', 'w', 'w', '.', 'j', 'e', 'a', 'p', 'e', 'd', 'u', '.', 'c', 'o', 'm']
    >>> 

          学Python吧!太强大了!

    --->





  • 相关阅读:
    压缩自编码器具备天然的模式过滤能力
    自编码器天生具备压缩、去噪和生成新样本的能力
    1338. Reduce Array Size to The Half
    442. Find All Duplicates in an Array
    1343. Number of Sub-arrays of Size K and Average Greater than or Equal to Threshold
    1437. Check If All 1's Are at Least Length K Places Away
    695. Max Area of Island
    1414. Find the Minimum Number of Fibonacci Numbers Whose Sum Is K
    1233. Remove Sub-Folders from the Filesystem
    238. Product of Array Except Self
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3201243.html
Copyright © 2020-2023  润新知