美文网首页我爱编程
第2章 列表和元组

第2章 列表和元组

作者: 程序员必修课 | 来源:发表于2018-04-12 16:46 被阅读0次
    第2章 列表和元组

    在Python中,最基本的数据结构为序列(sequence)。序列中的每个元素都有编号,即其位置或索引,其中第一个元素的索引为0,第二个元素的索引为1,依此类推。同时可回绕到序列末尾,用负索引表示序列末尾元素的位置。本章介绍一些通用的操作。

    2.1 序列概述

    列表和元组的主要不同在于,列表是可以修改的,而元组不可以。

    列表中,所有元素都放在方括号内,并用逗号隔开。类似于其他语言的数组了。序列中还可以包含其他序列。

    2.2 通用的序列操作

    2.2.1 索引

    序列中的所有元素都有编号——从0开始递增。

    >>> greeting = 'Hello' 
    >>> greeting[0]
    H
    

    字符串就是由字符组成的序列。不同于其他一些语言,Python没有专门用于表示字符的类型,因此一个字符就是只包含一个元素的字符串。

    当使用负数索引时,Python将从右往左数,-1是最后一个元素的位置。

    对于字符串字面量(以及其他的序列字面量) ,可直接对其执行索引操作,无需先将其赋给变量。这与先赋给变量再对变量执行索引操作的效果是一样的。

    >>>'Hello'[1]
    'e'
    

    2.2.2 切片

    切片可以访问特定范围内的元素。切片使用两个索引,并用冒号分隔。区间是左闭右开。

    如果第一个索引指定的元素位于第二个索引指定的元素后面,结果就为空序列。即使index越界也不报错,只返回空序列。

    一种简写:如果切片结束于序列末尾,可省略第二个索引;如果切片始于序列开头,可省略第一个索引。要复制整个序列,可将两个索引都省略。

    >>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    >>> numbers[-3:] 
    [8, 9, 10]
    >>> numbers[:3] 
    [1, 2, 3]
    >>> numbers[:] 
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    

    切片操作中有另一个参数,即步长。普通切片中步长为1,如果指定步长大于1,可以跳过一些元素。步长不能为0,但可以为负数,即从右向左提取元素。步长为负数时,第一个索引必须比第二个索引大。

    2.2.3 序列相加

    可使用加法运算符来拼接序列。一般而言,不能拼接不同类型的序列。

    >>> [1, 2, 3] + [4, 5, 6] 
    [1, 2, 3, 4, 5, 6] 
    >>> 'Hello,' + 'world!' 
    'Hello, world!' 
    # >>> [1, 2, 3] + 'world!' 不能拼接
    >>> [1,'hello']+['world']
    [1, 'hello', 'world']
    

    2.2.4 乘法

    将序列与数x相乘时,将重复这个序列x次来创建一个新序列。

    空列表是使用不包含任何内容的两个方括号[]表示的。None表示什么都没有(None必须是大写)。
    要将列表的长度初始化为10,可像下面这样做:

    >>> sequence = [None] * 10 
    >>> sequence 
    [None, None, None, None, None, None, None, None, None, None]
    

    2.2.5 成员资格

    要检查特定的值是否包含在序列中,可使用运算符in。返回值为布尔值。
    字符串的检查也可以用in,且单独字符和子串都可以用于判断。

    内置函数len、min和max很有用,其中函数len返回序列包含的元素个数,而min和max分别返回序列中最小和最大的元素。

    2.3 列表:Python 的主力

    2.3.1 函数 list

    为此,可使用函数list创建字符串的列表。

    >>> list('Hello') 
    ['H', 'e', 'l', 'l', 'o']
    

    2.3.2 基本的列表操作

    1.修改列表:给元素赋值

    修改列表可以用普通赋值语句直接给指定索引位置元素赋值。

    2.删除元素

    使用del语句

    >>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl'] 
    >>> del names[2] 
    >>> names 
    ['Alice', 'Beth', 'Dee-Dee', 'Earl']
    

    3.给切片赋值

    通过切片可以同时给多个元素赋值,并且可以将切片帖换位为长度与其不同的序列

    >>> name = list('Perl')
    >>> name ['P', 'e', 'r', 'l']
    >>> name[2:] = list('ar')
    >>> name
    ['P', 'e', 'a', 'r']
    >>> name[1:] = list('ython')
    >>> name
    ['P', 'y', 't', 'h', 'o', 'n']
    

    使用切片赋值还可在不替换原有元素的情况下插入新元素。也可以反过来删除切片。

    >>> numbers = [1, 5]
    >>> numbers[1:1] = [2, 3, 4]
    >>> numbers
    [1, 2, 3, 4, 5]
    >>> numbers[1:4] = [] 
    >>> numbers 
    [1, 5]
    

    2.3.3 列表方法

    1.append

    方法append用于将一个对象附加到列表末尾

    >>> lst = [1, 2, 3] 
    >>> lst.append(4) 
    >>> lst 
    [1, 2, 3, 4]
    

    append直接修改原有列表,不会返回创建新列表。

    2.clear

    方法clear就地清空列表的内容。这类似于切片赋值语句lst[:] = []。

    3.copy

    方法copy复制列表。常规复制只是将另一个名称关联到列表。copy类似于使用a[:]或list(a),它们也都复制。

    >>> a = [1, 2, 3]
    >>> b = a
    >>> b[1] = 4
    >>> a
    [1, 4, 3]
    >>> b = a.copy()
    >>> b[1] = 2
    >>> a
    [1, 4, 3]
    >>> b
    [1, 2, 3]
    >>> c = b[:]
    >>> c[1] = 4
    >>> c
    [1, 4, 3]
    >>> b
    [1, 2, 3]
    

    4.count

    方法count计算指定的元素在列表中出现了多少次。

    >>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]] 
    >>> x.count(1) 
    2 
    >>> x.count([1, 2]) 
    1
    

    5.extend

    方法extend让你能够同时将多个值附加到列表末尾。类似于列表拼接,但是常规拼接是返回一个新的序列。

    常规拼接必须使用a和b的副本创建一个新列表,因此如果你要获得类似于下面的效果,拼接的效率将比extend低。

    >>> a = a + b
    

    以下方法虽然可行,但是可读性不高。

    >>> a = [1, 2, 3] 
    >>> b = [4, 5, 6] 
    >>> a[len(a):] = b 
    >>> a 
    [1, 2, 3, 4, 5, 6]
    

    6.index

    方法index在列表中查找指定值第一次出现的索引。

    >>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni'] 
    >>> knights.index('who') 
    4
    

    7.insert

    方法insert用于将一个对象插入列表。

    >>> numbers = [1, 2, 3, 5, 6, 7] 
    >>> numbers.insert(3, 'four') 
    >>> numbers 
    [1, 2, 3, 'four', 5, 6, 7]
    

    8.pop

    方法pop从列表中删除一个元素(末尾为最后一个元素),并返回这一元素。
    pop是唯一既修改列表又返回一个非None值的列表方法。

    >>> x = [1, 2, 3] 
    >>> x.pop() 
    3 
    >>> x [1, 2] 
    >>> x.pop(0) 
    1 
    >>> x 
    [2]
    

    append和pop可以实现

    insert(0,...)替代append可以实现队列
    append和pop(0)也可以。更好的解决方案是使用collections中的deque。

    9.remove

    方法remove用于删除第一个为指定值的元素。

    >>> x = ['to', 'be', 'or', 'not', 'to', 'be'] 
    >>> x.remove('be') 
    >>> x 
    ['to', 'or', 'not', 'to', 'be']
    

    10.reverse

    方法reverse按相反的顺序排列列表中的元素。reverse修改列表,但不返回任何值(与remove和sort等方法一样)。

    11.sort

    方法sort用于对列表就地排序。

    函数sorted返回值是一个列表。

    12.高级排序

    方法sort接受两个可选参数:key和reverse。

    >>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate'] 
    >>> x.sort(key=len) 
    >>> x 
    ['add', 'acme', 'aerate', 'abalone', 'aardvark']
    

    对于另一个关键字参数reverse, 只需将其指定为true,以指出是否要按相反的顺序对列表进行排序。

    >>> x = [4, 6, 2, 1, 7, 9] 
    >>> x.sort(reverse=True) 
    >>> x 
    [9, 7, 6, 4, 2, 1]
    

    2.4 元组:不可修改的序列

    与列表一样,元组也是序列,唯一的差别在于元组是不能修改的。(字符串也不能修改)

    元组语法很简单,只要将一些值用逗号分隔,就能自动创建一个元组。元组还可用圆括号括起(这也是通常采用的做法)。

    >>> 1, 2, 3 
    (1, 2, 3)
    >>> (1, 2, 3) 
    (1, 2, 3)
    

    空元组用两个不包含任何内容的圆括号表示。

    >>> () 
    ()
    

    一个值的元组需要在值后加逗号。

    >>> 42, 
    (42,)
    

    函数tuple的工作原理与list很像:它将一个序列作为参数,并将其转换为元组。如果参数已经是元组,就原封不动地返回它。

    相关文章

      网友评论

        本文标题:第2章 列表和元组

        本文链接:https://www.haomeiwen.com/subject/bpkfkftx.html