购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.2
列表

Python中的列表是由一系列按特定顺序排列的元素组成的,是Python中内置的可变序列。在形式上,列表的所有元素都放在一对方括号([ ])中,两个相邻元素间使用逗号(,)分隔。在内容上,可以将整数、浮点数、字符串、列表、元组等任何类型的内容放入列表中,并且同一个列表中元素的类型可以不同,因为它们之间没有任何关系。

3.2.1 创建与删除列表

在Python中提供了多种创建列表的方法,下面进行详细介绍。

1.使用赋值运算符直接创建列表

同其他类型的Python变量一样,创建列表时也可以使用赋值运算符(=)直接将一个列表赋值给变量,语法格式如下:

    listname=[element1,element2,element3,…,elementn]

参数说明:

● listname:表示列表的名称,可以是任何符合Python命名规则的标识符。

● element1,elemnet2,elemnet3,…,elemnetn:表示列表中的元素,元素个数没有限制,并且只要是Python支持的数据类型就可以。

例如,下面定义的列表都是合法的:

    num = [7,14,21,28,35,42,49,56,63]
    verse = ["自古逢秋悲寂寥","我言秋日胜春朝","晴空一鹤排云上","便引诗情到碧霄"]
    untitle = ['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","Web开发"]]
    python = ['优雅',"明确","简单"]
2.创建空列表

在Python中也可以创建空列表。例如,要创建一个名称为emptylist的空列表,可以使用下面的代码:

    emptylist = []
3.创建数值列表

在Python中,数值列表是很常用的,可以使用list()函数直接将range()函数循环出来的结果转换为列表。

list()函数的语法格式如下:

    list(data)

参数说明:

● data表示可以转换为列表的数据,其类型可以是range对象、字符串、元组或者其他可迭代类型的数据。

【例3.7】创建一个10~20(不包括20)所有偶数的列表。

    list(range(10,20,2))

运行上面的代码后,将得到下面的列表:

    [10,12,14,16,18]
提示

使用list()函数不仅能通过range对象创建列表,还可以通过其他对象创建列表。

4.删除列表

对于已经创建的列表,当它不再被使用时,可以使用del语句删除。语法格式如下:

    del listname

参数说明:

● listname:表示要删除的列表的名称。

【例3.8】定义一个名称为team的列表,然后应用del语句将其删除。

    team=["皇马","罗马","利物浦","拜仁"]
    delteam

3.2.2 访问列表元素

在Python中,如果想输出列表的内容也是比较简单的,直接使用print()函数即可。

【例3.9】创建一个名称为untitle的列表,并打印该列表。

    untitle=['Python',28,"人生苦短,我用Python",["爬虫","自动化运维","云计算","web
开发"]]
    print(untitle)

执行结果如下:

    ['Python',28,'人生苦短,我用Python',['爬虫','自动化运维','云计算','Web开发','
游戏']]

从上面的执行结果中可以看出,在输出列表时是包括方括号的。

如果不想要输出全部的元素,也可以通过列表的索引获取指定的元素。

【例3.10】要获取untitle列表中索引为2的元素。

    print(untitle[2])

执行结果如下:

    人生苦短,我用Python

从执行结果中可以看出,在输出单个列表元素时,不包括方括号,如果是字符串,还将不包括引号。

3.2.3 遍历列表

遍历列表中的所有元素是常用的一种操作,在遍历的过程中可以完成查询、处理等功能。在Python中遍历列表的方法有很多种,下面介绍常用的两种方法。

1.使用for循环

直接使用for循环遍历列表,只能输出元素的值,其语法格式如下:

    for item in listname:

参数说明:

● item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。

● listname:表示列表名称。

【例3.11】定义一个保存2017—2018赛季NBA西部联盟前八名的列表,然后通过for循环遍历该列表,并输出各个球队的名称。

    print("2017~2018赛季NBA西部联盟前八名:")
    team = ["休斯敦火箭", "金州勇士", "波特兰开拓者", "犹他爵士", "新奥尔良鹈鹕", "圣安东
尼奥马刺", "俄克拉何马城雷霆", "明尼苏达森林狼"]
    for item in team:
         print(item)

执行上面的代码,结果如图3.1所示。

图3.1 通过for循环遍历列表

2.使用for循环和enumerate()函数

使用for循环和enumerate()函数可以同时输出索引值和元素内容,其语法格式如下:

    for index,item in enumerate(listname):

参数说明:

● index:用于保存元素的索引。

● item:用于保存获取到的元素值,要输出元素内容时,直接输出该变量即可。

● listname:表示列表名称。

【例3.12】定义一个保存2017—2018赛季NBA西部联盟前八名的列表,然后通过for循环和enumerate()函数遍历该列表,并输出索引和球队名称。

    print("2017—2018赛季NBA西部联盟前八名:")
    team = ["休斯敦火箭", "金州勇士", "波特兰开拓者", "犹他爵士", "新奥尔良鹈鹕", "圣安东
尼奥马刺", "俄克拉何马城雷霆", "明尼苏达森林狼"]
    for index, item in enumerate(team):
         print(index + 1, item)

执行上面的代码,结果如图3.2所示。

图3.2 通过for循环和enumerate9()函数

3.2.4 添加、修改和删除列表元素

添加、修改和删除列表元素也称为更新列表。在实际开发时,经常需要对列表进行更新。下面我们介绍如何实现列表元素的添加、修改和删除。

1.添加元素

在3.1.3节介绍了可以通过“+”号连接两个序列,通过该方法也可以实现为列表添加元素。但是这种方法的执行速度要比直接使用列表对象的append()方法慢,所以建议在添加元素时,使用列表对象的append()方法实现。列表对象的append()方法用于在列表的末尾追加元素,其语法格式如下:

    listname.append(obj)

参数说明:

● listname:为要添加元素的列表名称。

● obj:为要添加到列表末尾的对象。

【例3.13】定义一个包括4个元素的列表,然后应用append()方法向该列表的末尾添加一个元素。

    phone = ["摩托罗拉", "诺基亚", "三星", "OPPO"]
    len(phone)  # 获取列表的长度
    phone.append("iPhone")
    len(phone)  # 获取列表的长度
    print(phone)

上面代码的运行结果如图3.3所示。

图3.3 append()方法的使用

2.修改元素

修改列表中的元素只需要通过索引获取该元素,然后为其重新赋值即可。

【例3.14】定义一个保存3个元素的列表,然后修改索引值为2的元素。

    verse = ["长亭外","古道边","芳草碧连天"]
    print(verse)
    verse[2] = "一行白鹭上青天" #修改列表的第3个元素
    print(verse)

上述代码的运行结果如下:

    ['长亭外', '古道边', '芳草碧连天']
    ['长亭外', '古道边', '一行白鹭上青天']
3.删除元素

删除元素主要有两种方法,一种是根据索引进行删除,另一种是根据元素值进行删除。

● 根据索引进行删除

删除列表中的指定元素和删除列表类似,也可以使用del语句实现,所不同的就是在指定列表名称时换为列表元素。

【例3.15】定义一个保存3个元素的列表,删除最后一个元素。

    verse = ["长亭外","古道边","芳草碧连天"]
    del verse[-1]
    print(verse)

上述代码的运行结果如下:

    ["长亭外","古道边"]

● 根据元素值进行删除

如果想要删除一个不确定其位置的元素(即根据元素值删除),可以使用列表对象的remove()方法实现。

【例3.16】要删除列表中内容为“公牛”的元素。

    team=["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"]
    team.remove("公牛")

在使用remove()方法删除元素前,最好先判断该元素是否存在,改进后的代码如下:

    team = ["火箭","勇士","开拓者","爵士","鹈鹕","马刺","雷霆","森林狼"]
    value = "金牛"                   # 指定要移除的元素
    if team.count(value) > 0:# 判断要删除的元素是否存在
        team.remove(value)           # 移除指定的元素
        print(team)
提示

列表对象的count()方法用于判断指定元素出现的次数,返回结果为0时,表示不存在该元素。关于count()方法的详细介绍请参见3.2.5节。

执行上面的代码后,得到的结果如下:

    ['火箭','勇士','开拓者','爵士','鸦鹕','马刺','雷霆','森林狼']

3.2.5 对列表进行统计和计算

Python的列表提供了内置的一些函数来实现统计、计算的功能。下面介绍几种常用的统计计算功能。

1.获取指定元素出现的次数

使用列表对象的count()方法可以获取指定元素在列表中的出现次数,其语法格式如下:

    listname.count(obj)

参数说明:

● listname:表示列表的名称。

● obj:表示要判断是否存在的对象,这里只能进行精确匹配,即不能是元素值的一部分。

【例3.17】创建一个列表,内容为听众点播的歌曲名称,然后应用列表对象的count()方法统计元素“云在飞”出现的次数。

    song = ["云在飞","我在诛仙道遥洞","送你一匹马","半壶纱","云在飞","遇见你","等你等
了那么久"]
    num = song.count("云在飞")
    print(num)

上面的代码运行后,结果将显示为2,表示“云在飞”在song列表中出现了两次。

2.获取指定元素首次出现的位置

使用列表对象的index()方法可以获取指定元素在列表中首次出现的位置(即索引),其语法格式如下:

    listname.index(obj)

参数说明:

● listname:表示列表的名称。

● obj:表示要查找的对象,这里只能进行精确匹配。如果指定的对象不存在,则抛出异常。

【例3.18】获取指定元素首次出现的位置。

    aList = [123, 'xyz', 'runoob', 'abc']
    print "xyz 索引位置: ", aList.index( 'xyz' )
    print "runoob 索引位置 : ", aList.index( 'runoob', 1, 3 )

运行上面的代码,输出结果如下:

    xyz 索引位置:  1
    runoob 索引位置 :  2
3.统计数值列表的元素

在Python中,提供了sum()函数用于统计数值列表中各元素的和,其语法格式如下:

    sum(iterable[,start])

参数说明:

● iterable:表示要统计的列表。

● start:表示统计结果是从哪个数开始(即将统计结果加上start所指定的数),是可选参数,如果没有指定,默认值为0。

【例3.19】统计数值列表的元素。

    >>>sum([0,1,2])
    3
    >>> sum((2, 3, 4), 1)    # 元组计算总和后再加 1
    10
    >>> sum([0,1,2,3,4], 2)  # 列表计算总和后再加 2
    12

3.2.6 对列表进行排序

在Python中,提供了两种常用的对列表进行排序的方法:使用列表对象的sort()方法和使用内置的sorted()函数。

1.使用列表对象的sort()方法

列表对象提供了sort()方法用于对原列表中的元素进行排序,排序后原列表中的元素顺序将发生改变。列表对象的sort()方法的语法格式如下:

    listname.sort(key=None,reverse=False)

参数说明:

● listname:表示要进行排序的列表。

● key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。

● reverse:可选参数。如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列。默认为升序排列。

使用sort()方法进行数值列表的排序是比较简单的,直接比较数值大小即可。但是使用sort()方法对字符串列表进行排序时则稍显复杂,采用的规则是先对大写字母排序,然后对小写字母排序。如果想要在对字符串列表进行排序时不区分大小写,需要指定其key参数。

【例3.20】定义一个保存英文字符串的列表,然后应用sort()方法对其进行升序排列。

    char = ['cat', 'Tom', 'Angela', 'pet']
    char.sort()                          # 默认区分字母大小写
    print("区分字母大小写:", char)
    char.sort(key=str.lower)             # 不区分字母大小写
    print("不区分字母大小写:", char)

运行上面的代码,得到的结果如下:

    区分字母大小写:['Angela', 'Tom', 'cat', 'pet']
    不区分字母大小写:['Angela', 'cat', 'pet', 'Tom']
2.使用内置的sorted()函数

在Python中,提供了一个内置的sorted()函数用于对列表进行排序,使用该函数进行排序后原列表的元素顺序不变。storted()函数的语法格式如下:

    sorted(iterable,key=None,reverse=False)

参数说明:

● iterable:表示要进行排序的列表名称。

● key:表示指定从每个元素中提取一个用于比较的键(例如,设置“key=str.lower”表示在排序时不区分字母大小写)。

● reverse:可选参数。如果将其值指定为True,则表示降序排列;如果为False,则表示升序排列。默认为升序排列。

【例3.21】定义一个保存10名学生语文成绩的列表,然后应用sorted()函数对其进行排序。

    grade = [98, 99, 97, 100, 100, 96, 97, 89, 95, 100]  # 10名学生语文成绩列表
    grade_as = sorted(grade)                             # 进行升序排列
    print("升序", grade_as)
    grade_des = sorted(grade, reverse=True)              # 进行降序排列
    print("降序", grade_des)
    print("原序列", grade)

执行上面的代码,得到的结果如下:

    升序 [89, 95, 96, 97, 97, 98, 99, 100, 100, 100]
    降序 [100, 100, 100, 99, 98, 97, 97, 96, 95, 89]
    原序列 [98, 99, 97, 100, 100, 96, 97, 89, 95, 100]
提示

列表对象的sort()方法和内置sorted()函数的作用基本相同,不同点是在使用sort()方法时会改变原列表的元素排列顺序,而使用storted()函数时会建立一个原列表的副本,该副本为排序后的列表。

3.2.7 列表推导式

使用列表推导式可以快速生成一个列表,或者根据某个列表生成满足指定需求的列表。列表推导式通常有以下几种常用的语法格式。

(1)生成指定范围的数值列表,语法格式如下:

    list=[Expression for var in range]

参数说明:

● list:表示生成的列表名称。

● Expression:表达式,用于计算新列表的元素。

● var:循环变量。

● range:采用range()函数生成的range对象。

【例3.22】要生成一个包括10个随机数的列表,要求数值范围为10~100(包括10和100)。

    import random     # 导入random标准库
    randomnumber=[random.randint(10,100) for i in range(10)]
    print("生成的随机数为:",randomnumber)

执行结果如下:

    生成的随机数为: [16, 50, 20, 32, 49, 21, 26, 37, 84, 22]

(2)生成指定需求的列表,语法格式如下:

    newlist=[Expression for var in list]

参数说明:

● newlist:表示新生成的列表名称。

● Expression:表达式,用于计算新列表的元素。

● var:变量,值为list中的每个元素值。

● list:用于生成新列表的原列表。

【例3.23】定义一个记录商品价格的列表,然后应用列表推导式生成一个将全部商品价格打五折的列表。

    price=[1200,5330,2988,6200,1998,8888]
    sale=[int(x*0.5) for x in price]
    print("原价格:",price)
    print("打五折的价格:",sale)

运行上面的代码,输出结果如下:

    原价格: [1200, 5330, 2988, 6200, 1998, 8888]
    打五折的价格:[600, 2665, 1494, 3100, 999, 4444]

(3)从列表中选择符合条件的元素组成新的列表,语法格式如下:

    newlist=[Expression for var in list if condition]

参数说明:

● newlist:表示新生成的列表名称。

● Expression:表达式,用于计算新列表的元素。

● var:变量,值为后面列表的每个元素值。

● list:用于生成新列表的原列表。

● condition:条件表达式,用于指定筛选条件。

【例3.24】定义一个记录商品价格的列表,然后应用列表推导式生成一个商品价格高于5000元的列表。

    price=[1200,5330,2988,6200,1998,8888]
    sale=[x for x in price if x > 5000]
    print("原列表:",price)
    print("价格高于5000的:",sale)

运行上面的代码,输出结果如下:

    原列表: [1200, 5330, 2988, 6200, 1998
    价格高于5000的: [5330, 6200, 8888]

3.2.8 二维列表的使用

在Python中,由于列表元素还可以是列表,所以它也支持二维列表的概念。二维列表中的信息以行和列的形式表示,第一个下标代表元素所在的行,第二个下标代表元素所在的列。在Python中,创建二维列表有以下3种常用的方法。

1.直接定义二维列表

在Python中,二维列表是包含列表的列表,即一个列表的每一个元素又都是一个列表。在创建二维列表时,可以直接使用下面的语法格式进行定义:

    listname=[[元素11,元素12,元素13,…,元素1n],
    [元素21,元素22,元素23,…,元素2n],***)
    ****
    [元素n1,元素n2,元素n3,…,元素nn]]

参数说明:

● listname:表示生成的列表名称。

● [元素11,元素12,元素13,…,元素In]:表示二维列表的第一行,也是一个列表。其中“元素11,元素12,…,元素In”代表第一行中的列。

● [元素21,元素22,元素23,…,元素2n]:表示二维列表的第二行。

● [元素nl,元素n2,元素n3,…,元素nn]:表示二维列表的第n行。

【例3.25】定义一个二维列表。

    test = [0, 0, 0], [0, 0, 0], [0, 0, 0]]
2.使用嵌套的for循环创建

创建二维列表,可以使用嵌套的for循环实现。

【例3.26】创建一个包含4行5列的二维列表。

    arr = []                    # 创建一个空列表
    for i in range(4):          # 循环4次,i的取值范围为0到3
        arr.append([])          # 在arr中添加一个空列表
        for j in range(5):   # 循环5次,j的取值范围为0到4
            arr[i].append(j) # 将j的值添加到arr的第i个列表中
3.使用列表推导式创建

使用列表推导式也可以创建二维列表,因为这种方法比较简洁,所以建议使用这种方法创建二维列表。

【例3.27】使用列表推导式创建一个包含4行5列的二维列表。

    arr= [[j for j in range(5)] for i in range(4)]

创建二维列表后,可以通过以下语法格式访问列表中的元素:

    listname[下标1][下标2]

参数说明:

● listname:列表名称。

● 下标1:表示列表中第几行,下标值从0开始,即第一行的下标为0。

● 下标2:表示列表中第几列,下标值从0开始,即第一列的下标为0。

【例3.28】访问二维列表中的第2行、第4列。 wlG4s40YjxXFqyo6QwT6bi0RfebImNC0SweNGer5vyHNRzSw9zxWmGO3jdD6YpYg

    verse[1][3]
点击中间区域
呼出菜单
上一章
目录
下一章
×