《Python程序设计》——2.4 列表、元组和文件

简介:

本节书摘来自华章计算机《Python程序设计》一书中的第2章,第2.4节,作者:[美]戴维 I.施奈德(David I. Schneider)著,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.4 列表、元组和文件

Python文档和本书均使用术语对象,用于代表一种数据类型的任意实例。Python的核心对象是数值、字符串、列表、元组、文件、集合和字典。我们已经介绍过了数值和字符串。本节将介绍列表、元组和文件。集合和字典将在第5章中介绍。
2.4.1 列表对象
列表(list)是Python对象的一个有序序列。其中的对象可以是任何类型,并不要求类型必须一致。
列表的创建可以使用中括号将所有元素括起来,并且每个元素之间用逗号分隔。
列表的一些例子如下:
screenshot

列表通常要赋予一个名字。例如,我们可以写成:
screenshot

screenshot

与字符串中的字符类似,列表中的元素也是从前往后使用由0开始的正向索引进行索引,而且从后往前使用由-1开始的逆向索引进行索引。索引i对应元素的值记为listName [i]。例如,team[1]的值是2014,words[-2]的值是"spam"。
表2-5给出了列表的一些函数和方法。
提示:在执行了del函数或remove方法后,列表中被删除元素后的其他元素会依次向左移动一个位置。在执行了insert方法后,列表中大于或等于给定索引位置元素的其他元素会依次向右移动一个位置。
例1 成绩
下面的程序需要5个成绩作为输入,去掉两个最低分后给出平均值。这些成绩放入列表grades中,最低的两个成绩从列表中移除,然后使用sum和len函数计算剩余成绩的平均值。
screenshot
screenshot

索引i对应元素的值可以通过下面形式的语句给出:
screenshot

例如,在执行了words[1] = "eggs"语句后,words的值将变为["spam", "eggs"]。
注意:在2.2节中,我们曾提到在一对封闭括号中的任何代码都可以在多行显示。这样的规则对封闭的中括号同样有效。因此,语句:
screenshot

可以写成:
screenshot

2.4.2 切片
切片是由冒号语法表示的子列表。用法和字符串的切片非常类似。表2-6显示了一些切片的表示语法。
screenshot

注意:del函数可用于从列表中移除一个切片。同样,如果索引m对应的元素不在索引n对应的元素的左边,那么list1[m:n]将是一个空列表。
表2-7给出了切片的一些例子。
screenshot

2.4.3 split和join方法
split和join是非常有用的方法,但它们的作用正好相反。split方法将一个字符串变成其子串组成的列表,而join方法将一个字符串列表变成一个字符串。
一般而言,如果strVar赋值为“value0,value1,value2,…, valueN”形式的字符串,那么下面形式的语句:
screenshot

创建了包含N+1个字符串作为其元素的列表L。即列表中的第一个元素是strVal中第一个逗号前的文本,第二个元素是第一个逗号和第二个逗号之间的文本,…,最后一个元素是最后一个逗号之后的文本。包含逗号的字符串称为上述语句的分隔符。任意字符串都可以作为分隔符(三种常用的单字符分隔符是逗号(,)、换行符(n)和空格)。如果没有指定分隔符,split方法将使用空白作为分隔符,其中空白字符串是由换行符、制表符和空格组成的任意字符串。在第5章,split方法将发挥重要的作用。
join方法,作为split方法的逆操作,将一个字符串列表变成一个由列表中所有元素用指定字符串分隔连接而成的字符串。使用join方法并用","作为分隔符的一般语句形式为:
screenshot

例2 split方法
下面的每条语句都显示了列表['a', 'b', 'c']。
screenshot

例3 join方法
下面的程序展示了如何使用join方法显示一个字符串列表中的所有元素。
screenshot

2.4.4 文本文件
Python程序中使用的数据都存储在内存中,当程序终止时就消失了。然而,如果程序将数据写入到存储设备(如硬盘或闪存盘)上的文件中,任何程序都可以稍后继续访问这些数据。也就是说,文件创建了长期存储的数据。
文本文件是由没有任何格式(即粗体或斜体)的文本行组成的简单文件,可以通过Notepad(PC)或TextEdit(Mac)进行创建和阅读。一般情况下,文本文件有txt的后缀。实际上,文本文件可以使用任何文本处理器来创建。例如,在Word中创建一个文档,你可以选择“另存为”,然后选择“存储为:纯文本(*.txt)”将文档存为文本文件。
任何已有的文本文件也可以由Word打开和编辑。文本文件的每一行都以换行符结尾(可能除了最后一行)。
文本文件的所有行(移除最后的换行符)可以通过以下形式的代码放入到一个列表中:
screenshot

之后的三章将解释这个语句是如何完成这项任务的。目前,我们就假设它能够完成这项工作。
如果文本文件中数据都是数字,下面段落的处理过程将产生一个字符串列表,其中的每个字符串存储一个数字。对于由数字组成的文件,我们可以通过以下形式的代码将所有数字放入到一个列表中:
screenshot

2.4.5 元组对象
元组(tuple)与列表类似,是元素的有序序列。元组和列表的主要区别在于元组不可以直接修改,即元组没有append、extend和insert方法。元组中的元素也不可以直接删除或修改。除此之外,列表中的其他函数和方法对元组同样适用。元组中的元素可以索引。元组可以切片、连接和重复。
元组的定义可以通过由逗号分隔和括号包围的一个序列来完成。然而,元组经常还可以不使用括号来定义。例如,语句
screenshot

创建了元组t,并赋予相同的值。但是,print函数总是会显示由括号包围的元组。
例4 元组函数
下面的程序显示了元组具有和列表一样的一些函数。
screenshot

下列的语句:
screenshot

创建了三个变量,并分别赋值给它们。这个语句也可以写成:
screenshot

它可以看作是用一个语句同时给三个变量进行了赋值。
例5 交换数值
下面的程序交换了两个变量的值。其实程序的第三行是将元组tuple (6, 5) 赋值给元组tuple (x, y)。
screenshot

2.4.6 嵌套列表
到目前为止,列表和元组中的所有元素都是数字或者字符串。但是,其中的元素也可以是列表或元组。由元组构成的列表在数据分析中扮演着至关重要的角色。如果L是一个由元组构成的列表,那么L[0]是第一个元组,L0是第一个元组中的第一个元素。L[-1](等同于L[len(L)-1])是最后一个元组,L-1是最后一个元组中的最后一个元素。像L0这样的表达式可以看做是(L[0])[0]。
例6 美国地域
列表regions包含了四个元组,每个元组给出了美国的一个地域名及其2010年的人口(百万计)。下面的程序显示了中西部2010年的人口,并计算出美国2010的总人口。
screenshot

2.4.7 不可变和可变对象
对象是一个可以存储数据并有可以操纵数据的操作或方法的实体。数值、字符串、列表和元组都是对象。当一个变量使用赋值语句创建出来后,等号右边的值变成了内存中的一个对象,而变量引用(即指向)那个对象。当改变一个列表时,这个变化是作用在列表内存位置中的对象上的。但是,当一个变量要改变它的值并且这个值是数值、字符串或元组时,Python会分配一个新的内存位置存储新值,并将变量引用到新的对象上。
可以说列表能够原地修改,但是数值、字符串和元组不可以。能够原地修改的对象称为可变的,而不能原地修改的对象称为不可变的。图2-29显示了8行代码以及执行完前4行代码和所有8行代码后的内存分配情况。
screenshot

2.4.8 列表复制
如果变量var1是一个可变数据(如列表),那么var2 = var1的这种语句形式会将var2和var1一样引用同一个对象。因此,任何对var2的值的改变都会影响var1的值。请思考下面的四行代码:
screenshot

在第二行代码中,变量list2引用的是和list1一样的内存位置。因此,对list2中一个元素的任意改变将对list1产生相同的变化。如果将第二行代码变成list2 = list(list1)或list2 = list1[:],这种影响就不会出现了。在这种情况下,list2指向了包含与list1一样的值,但list2是一个在不同内存位置上的对象。之后第三行代码并不会影响list1所指向的内存位置,所以输出结果是['a', 'b']。
2.4.9 索引、删除和切片越界
Python不允许列表和元组中单个元素的索引越界,但是在切片中可以允许索引越界。例如,如果
screenshot

那么print(list1[7])、print(list1[-7])和del list1[7]会产生回溯的错误消息IndexError。
如果切片的左边索引过小,切片会从列表的第一项开始,如果切片的右边索引过大,切片会一直到列表的最后一项。例如,

screenshot

注释

  1. 当max和min作用于包含字符串的列表时,字符串按照字典排序进行比较。字符串的字典排序会在3.1节中介绍。
  2. 空元组可以写成空的括号对。
  3. 单个元素组成的元组有一个末尾的逗号,如(0,)。
  4. list函数可以将元组或字符串转化为列表。例如,list(('a', 'b'))的值为['a', 'b'],list("Python")的值为['P', 'y', 't', 'h', 'o', 'n']。
  5. tuple函数可以将列表或字符串转化为元组。例如,tuple(['a', 'b'])的值为('a', 'b'),tuple("spam")的值为('s', 'p', 'a', 'm')。
  6. 元组比列表更加高效,因此应该在元素不会发生改变的情况下使用。它们执行得更快、内存占用更少,而且能够“写保护”数据。第5章会介绍一种强大的叫作字典的Python对象。字典的一个重要特性就是需要使用元组。
  7. 正如我们所见到的,列表中元素的值是可以通过它的索引以listName[i] = newValue 的语句形式进行更改。即使字符串中的字符和元组中的元素可以通过索引进行访问,但是stringName[i] = newValue和tupleName[i] = newValue这样的语句是不合法的。
  8. 对于列表和元素,操作符+=表示增量赋值。
  9. 我们已经介绍过了核心对象数值、字符串、列表和元组。其他两个核心对象(集合和字典)会在第5章中进行介绍。尽管它们已经在2.4节中出现过,我们仍打算推迟到有需要的时候再介绍它们。
    实践问题2.4
  10. 给出以下程序的输出。
    screenshot
  11. 给出以下程序的输出。
    screenshot
  12. 语句s = 'a' + 'b'和语句s = "".join(['a', 'b'])是将相同的值赋给了变量s吗?
    习题2.4

在习题1~48中,假定列表states包含了美国50个州的名字,并按照它们加入联邦的时间顺序进行排列。给出下列代码行相应的输出。
screenshot
screenshot
screenshot

在习题49~54中,假定list1包含100个元素,给出下面每个切片中元素的数目。
screenshot

在习题55~58中,假定列表nums = [6, 2, 8, 0],给出下列代码行相应的输出。
screenshot
screenshot

在习题59~94中,给出下列代码行相应的输出。
screenshot
screenshot
screenshot
screenshot
screenshot
screenshot
screenshot

在习题95~100中,找到所有的错误。
screenshot

  1. 分析语句 编写一个程序,分析由用户输入的句子中单词的个数。如图2-30所示。
  2. 分析语句 编写一个程序,显示由用户输入的句子中起始和末尾的单词。如图2-31所示。假定唯一的标点符号是句子末尾的句号。
    screenshot
  3. 姓名 编写一个程序,输入姓名的两个部分,然后以“lastName, firstName”的方式显示姓名。如图2-32所示。
  4. 姓名 编写一个程序,输入姓名的三个部分,显示中间名。如图2-33所示。
    screenshot

实践问题2.4的解答

  1. Amazon.com is located in Seattle, WA。
    列表companies是元组组成的列表,其中的每一项可以通过companies[0]、companies[1]和companies[2]进行引用。程序引用了Amazon对应的元组companies[1]。Amazon元组中的三个元素可以通过companies1、companies1和companies1引用。提示:companies1可以看做(companies[1])[0],companies1可以看做(companies[1])[1],companies1可以看做(companies[1])[2]。
  2. (5,)
    5

()
第一个和第三个print函数的参数是元组。第一个print函数中的逗号表明这个参数是一个单个元素构成的元组,因此函数显示为一个元组。由于第二个print函数中的参数没有逗号,因此括号对仅仅包含了一个表达式。第三个print语句显示了一个空元组。

  1. 是。出于性能的考虑,使用join的语句更胜一筹。
    screenshot

screenshot
screenshot
screenshot
screenshot

编程项目

  1. 找零钱 编写一个程序,将用户输入的从0~99美分的金额变为零钱。程序的输出需要显示用于找零的各种面额硬币的数量。如图2-34所示。
  2. 汽车贷款 如果以r%的月复合利率借贷A美元用于购买汽车,按月归还贷款n年,每月应归还的贷款可以通过以下公式给出:
    screenshot

其中。编写一个程序,在用户输入贷款额、利率和贷款年限后,计算每月的还款额。如图2-35所示。
screenshot

  1. 债券收益 债券表现的一个度量是它的到期收益率(YTM)。政府债券的YTM值计算复杂,并且公布在表格上。但是,它们可以通过一个简单的公式screenshot进行估算,其中intr是每年获得的利息,screenshot。例如,假定债券的面值为1 000美元,票面利率为4%,15年到期,当前售出价1 180美元。那么intr = 0.04×
  2. 000 = 40,screenshot提示:债券的面值是当它到期赎回时的金额,票面利率是债券定期的利率。如果债券是首次发行时购买,YTM与票面利率相同。编写一个程序,要求输入面值、票面利率、当前市场价格和债券到期年数,然后计算债券的YTM。如图2-36所示。
  3. 单位价格 编写一个程序,要求输入物品的价格和重量(磅和盎司),然后给出每盎司的价格。如图 2-37所示。
    screenshot
  4. 股票投资组合 投资者的股票投资组合包括四个交易所基金(SPY、QQQ、EEM和VXX)。编写一个程序,要求输入每个基金的投资额,然后显示总投资额和每项基金在总投资额中的占比。如图2-38所示。
  5. 长度转换 编写一个程序,将美国惯用单位制的英里、码、英尺和英寸转换为公制单位的千米、米和厘米。一个例子如图2-39所示。在输入了英里数、码数、英尺数和英寸数后,长度全部转换为英寸,然后再除以39.37得到米数。int函数可用来将总米数分为整数千米数和米数。厘米数可以通过小数部分进行显示。所需要的计算公式如下所示:
    screenshot

screenshot

相关文章
|
17天前
|
Python
【python】python跨文件使用全局变量
【python】python跨文件使用全局变量
|
25天前
|
监控 数据处理 索引
使用Python批量实现文件夹下所有Excel文件的第二张表合并
使用Python和pandas批量合并文件夹中所有Excel文件的第二张表,通过os库遍历文件,pandas的read_excel读取表,concat函数合并数据。主要步骤包括:1) 遍历获取Excel文件,2) 读取第二张表,3) 合并所有表格,最后将结果保存为新的Excel文件。注意文件路径、表格结构一致性及异常处理。可扩展为动态指定合并表、优化性能、日志记录等功能。适合数据处理初学者提升自动化处理技能。
21 1
|
1天前
|
数据挖掘 索引 Python
Python 读写 Excel 文件
Python 读写 Excel 文件
6 0
|
3天前
|
索引 容器
06-python数据容器-list列表定义/list的10个常用操作/列表的遍历/使用列表取出偶数
06-python数据容器-list列表定义/list的10个常用操作/列表的遍历/使用列表取出偶数
|
4天前
|
存储 索引 Python
python学习7-元组
python学习7-元组
|
4天前
|
存储 索引 Python
python学习5-列表的创建、增删改查、排序
python学习5-列表的创建、增删改查、排序
|
7天前
|
存储 安全 索引
「Python系列」Python元组
Python中的元组(Tuple)是一种不可变的有序序列类型,它允许你存储多个不同类型的元素,并且这些元素在元组中是按照特定的顺序排列的。一旦一个元组被创建,你就不能修改它(即不能添加、删除或更改元组中的元素),这使得元组成为一种非常安全的数据结构,因为一旦它们被创建,就不
15 1
|
10天前
|
索引 Python 容器
python 数据类型之列表
python 数据类型之列表
|
17天前
|
存储 Java 程序员
【Python】6. 基础语法(4) -- 列表+元组+字典篇
【Python】6. 基础语法(4) -- 列表+元组+字典篇
40 1
|
17天前
|
C++ Python
【C++/Python】C++调用python文件
【C++/Python】C++调用python文件