翻译:《实用的Python编程》01_05_Lists
目录 | 上一节 (1.4 字符串) | 下一节 (1.6 文件)
1.5 列表
本节介绍 Python 原始数据类型列表(list)。 列表是一种有序的集合。
创建列表
使用方括号 [] 来定义列表字面量。
names = [ 'Elwood', 'Jake', 'Curtis' ]
nums = [ 39, 38, 42, 65, 111]
有时候,列表也可以通过其它方法创建。例如:使用字符串的 split()
方法可以将一个字符串拆分为一个列表:
>>> line = 'GOOG,100,490.10'
>>> row = line.split(',')
>>> row
['GOOG', '100', '490.10']
>>>
列表操作
列表可以存储任何类型的项(译注:item,或者称为元素)。使用 append()
方法添加一个新的项:
names.append('Murphy') # Adds at end
names.insert(2, 'Aretha') # Inserts in middle
使用加号 + 来拼接列表:
s = [1, 2, 3]
t = ['a', 'b']
s + t # [1, 2, 3, 'a', 'b']
列表通过整数进行索引,索引从 0 开始。
names = [ 'Elwood', 'Jake', 'Curtis' ]
names[0] # 'Elwood'
names[1] # 'Jake'
names[2] # 'Curtis'
负索引从列表尾部开始计数:
names[-1] # 'Curtis'
你可以改变列表中的任何项:
names[1] = 'Joliet Jake'
names # [ 'Elwood', 'Joliet Jake', 'Curtis' ]
列表的长度:
names = ['Elwood','Jake','Curtis']
len(names) # 3
成员测试(in
, not in
):
'Elwood' in names # True
'Britney' not in names # True
复制(s * n
):
s = [1, 2, 3]
s * 3 # [1, 2, 3, 1, 2, 3, 1, 2, 3]
列表遍历和查找:
使用 for
遍历列表内容:
for name in names:
# use name
# e.g. print(name)
...
这和其它编程语言的 foreach
语句类似。
为了快速找到某项的位置(索引),使用 index()
函数:
names = ['Elwood','Jake','Curtis']
names.index('Curtis') # 2
如果元素出现不止一次,index()
方法将会返回元素第一次出现的索引。
如果元素没有找到,index()
方法将引发 ValueError
异常。
列表删除
你可以按元素值或者按索引删除元素:
# Using the value
names.remove('Curtis')
# Using the index
del names[1]
移除一个元素不会“留空”。其它的元素将会移动来填充删除元素后腾出的空间。如果元素出现不止一次,remove()
方法将只删除第一次出现的元素。
列表排序
列表可以“原地”排序:
s = [10, 1, 7, 3]
s.sort() # [1, 3, 7, 10]
# Reverse order
s = [10, 1, 7, 3]
s.sort(reverse=True) # [10, 7, 3, 1]
# It works with any ordered data
s = ['foo', 'bar', 'spam']
s.sort() # ['bar', 'foo', 'spam']
如果你想生成一个新的列表,使用 sorted()
函数:
t = sorted(s) # s unchanged, t holds sorted values
列表和数学
警告:列表不是为数学运算而设计的:
>>> nums = [1, 2, 3, 4, 5]
>>> nums * 2
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
>>> nums + [10, 11, 12, 13, 14]
[1, 2, 3, 4, 5, 10, 11, 12, 13, 14]
特别地,列表无法像 MATLAB, Octave, R 那样表示向量/矩阵。但是,有一些包可以帮助你解决这个问题(例如:numpy)。
练习
在本次练习中,我们尝试使用 Python 的列表数据类型。在上一节中,你使用了包含股票代码的字符串:
>>> symbols = 'HPQ,AAPL,IBM,MSFT,YHOO,DOA,GOOG'
使用字符串的 split()
方法把 symbols 拆分为一个包含股票代码名字的列表:
>>> symlist = symbols.split(',')
练习1.19:提取和重新分配列表元素
尝试一些查找:
>>> symlist[0]
'HPQ'
>>> symlist[1]
'AAPL'
>>> symlist[-1]
'GOOG'
>>> symlist[-2]
'DOA'
>>>
尝试重新分配一个值:
>>> symlist[2] = 'AIG'
>>> symlist
['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'DOA', 'GOOG']
>>>
切片:
>>> symlist[0:3]
['HPQ', 'AAPL', 'AIG']
>>> symlist[-2:]
['DOA', 'GOOG']
>>>
创建一个空的列表并添加一个元素到其中:
>>> mysyms = []
>>> mysyms.append('GOOG')
>>> mysyms
['GOOG']
你可以将一个列表的一部分重新分配到另一个列表中。例如:
>>> symlist[-2:] = mysyms
>>> symlist
['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG']
>>>
当执行此操作时,左手边的列表(symlist
)的大小将会被适当调整,以适应右手边的列表。
例如,在上面的实例中,symlist
的最后两项被 mysyms
列表中的单个元素('GOOG')取代。
练习1.20:遍历列表元素
for
循环可以遍历列表这样的序列。通过输入下列的循环并且查看发生了什么来验证这点:
>>> for s in symlist:
print('s =', s)
# Look at the output
练习1.21:成员测试
使用 in
或者 not in
操作符来检查 'AIG'
,'AA'
,和 'CAT'
是否在 symbols 列表中:
>>> # Is 'AIG' IN the `symlist`?
True
>>> # Is 'AA' IN the `symlist`?
False
>>> # Is 'CAT' NOT IN the `symlist`?
True
>>>
练习 1.22:添加,插入和删除元素
使用 append()
方法把 'RHT'
添加到列表 symlist
的末尾:
>>> # append 'RHT'
>>> symlist
['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG', 'RHT']
>>>
使用 insert()
方法把 'AA'
作为列表的第二个元素插入到列表中:
>>> # Insert 'AA' as the second item in the list
>>> symlist
['HPQ', 'AA', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG', 'RHT']
>>>
使用 remove()
方法从列表中删除 'MSFT'
:
>>> # Remove 'MSFT'
>>> symlist
['HPQ', 'AA', 'AAPL', 'AIG', 'YHOO', 'GOOG', 'RHT']
>>>
添加一个重复的 'YHOO'
条目到列表的末尾。
注意:列表有重复的值是完全没有问题的:
>>> # Append 'YHOO'
>>> symlist
['HPQ', 'AA', 'AAPL', 'AIG', 'YHOO', 'GOOG', 'RHT', 'YHOO']
>>>
使用 index()
方法查看 'YHOO'
在列表中的第一个位置:
>>> # Find the first index of 'YHOO'
4
>>> symlist[4]
'YHOO'
>>>
统计 'YHOO'
在列表中出现了多少次:
>>> symlist.count('YHOO')
2
>>>
删除第一次出现的 'YHOO'
:
>>> # Remove first occurrence 'YHOO'
>>> symlist
['HPQ', 'AA', 'AAPL', 'AIG', 'GOOG', 'RHT', 'YHOO']
>>>
众所周知,没有方法找到或者删除某个元素在列表中重复出现的所有项。但是,我们将会在第二节看到一种优雅的方式去实现它。
练习1.23:排序
想要对一个列表排序吗?使用 sort()
方法。试试看:
>>> symlist.sort()
>>> symlist
['AA', 'AAPL', 'AIG', 'GOOG', 'HPQ', 'RHT', 'YHOO']
>>>
想要对一个列表倒序吗?尝试这个:
>>> symlist.sort(reverse=True)
>>> symlist
['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA']
>>>
注意:对列表排序可以“原地”修改其内容。也就是说,是对列表的元素进行“洗牌”,而不是创建一个新的列表作为结果。
练习 1.24:列表转字符串
想要把一个包含字符串的列表连接到一个字符串中吗?像下面这样使用字符串的 join()
方法实现(注意:这初看起来很有趣):
>>> a = ','.join(symlist)
>>> a
'YHOO,RHT,HPQ,GOOG,AIG,AAPL,AA'
>>> b = ':'.join(symlist)
>>> b
'YHOO:RHT:HPQ:GOOG:AIG:AAPL:AA'
>>> c = ''.join(symlist)
>>> c
'YHOORHTHPQGOOGAIGAAPLAA'
>>>
练习1.25:包含任何内容的列表
列表可以包含任何类型的对象,包括列表(示例:嵌套的列表)。试试看:
>>> nums = [101, 102, 103]
>>> items = ['spam', symlist, nums]
>>> items
['spam', ['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA'], [101, 102, 103]]
请注意上面的输出,items
是一个包含三个元素的列表,第一个元素是一个字符串,其它两个元素是列表。
你可以通过多个索引操作来访问嵌套列表的项。
>>> items[0]
'spam'
>>> items[0][0]
's'
>>> items[1]
['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA']
>>> items[1][1]
'RHT'
>>> items[1][1][2]
'T'
>>> items[2]
[101, 102, 103]
>>> items[2][1]
102
>>>
尽管在技术上能够生成非常复杂的列表结构,但作为一般规则,你还是希望保持简单。通常,列表存储类型相同的元素。例如,完全由数字或者文本字符串构成的列表。在同一个列表中混合不同类型的数据,往往会让人感到头痛,因此最好避免这种情况。
目录 | 上一节 (1.4 字符串) | 下一节 (1.6 文件)
注:完整翻译见 https://github.com/codists/practical-python-zh
翻译:《实用的Python编程》01_05_Lists的更多相关文章
- 翻译:《实用的Python编程》InstructorNotes
实用的 Python 编程--讲师说明 作者:戴维·比兹利(David Beazley) 概述 对于如何使用我的课程"实用的 Python 编程"进行教学的问题,本文档提供一些通用 ...
- 翻译:《实用的Python编程》README
欢迎光临 大约 25 年前,当我第一次学习 Python 时,发现 Python 竟然可以被高效地应用到各种混乱的工作项目上,我立即被震惊了.15 年前,我自己也将这种乐趣教授给别人.教学的结果就是本 ...
- 翻译:《实用的Python编程》05_02_Classes_encapsulation
目录 | 上一节 (5.1 再谈字典) | 下一节 (6 生成器) 5.2 类和封装 创建类时,通常会尝试将类的内部细节进行封装.本节介绍 Python 编程中有关封装的习惯用法(包括私有变量和私有属 ...
- 翻译:《实用的Python编程》04_02_Inheritance
目录 | 上一节 (4.1 类) | 下一节 (4.3 特殊方法) 4.2 继承 继承(inheritance)是编写可扩展程序程序的常用手段.本节对继承的思想(idea)进行探讨. 简介 继承用于特 ...
- 翻译:《实用的Python编程》01_02_Hello_world
目录 | 上一节 (1.1 Python) | 下一节 (1.3 数字) 1.2 第一个程序 本节讨论有关如何创建一个程序.运行解释器和调试的基础知识. 运行 Python Python 程序始终在解 ...
- 翻译:《实用的Python编程》03_03_Error_checking
目录 | 上一节 (3.2 深入函数) | 下一节 (3.4 模块) 3.3 错误检查 虽然前面已经介绍了异常,但本节补充一些有关错误检查和异常处理的其它细节. 程序是如何运行失败的 Python 不 ...
- 翻译:《实用的Python编程》03_04_Modules
目录 | 上一节 (3.3 错误检查) | 下一节 (3.5 主模块) 3.4 模块 本节介绍模块的概念以及如何使用跨多个文件的函数. 模块和导入 任何一个 Python 源文件都是一个模块. # f ...
- 翻译:《实用的Python编程》03_05_Main_module
目录 | 上一节 (3.4 模块) | 下一节 (3.6 设计讨论) 3.5 主模块 本节介绍主程序(主模块)的概念 主函数 在许多编程语言中,存在一个主函数或者主方法的概念. // c / c++ ...
- 翻译:《实用的Python编程》04_01_Class
目录 | 上一节 (3.6 设计讨论) | 下一节 (4.2 继承) 4.1 类 本节介绍 class 语句以及创建新对象的方式. 面向对象编程(OOP) 面向对象编程是一种将代码组织成对象集合的编程 ...
随机推荐
- js实现简单的俄罗斯方块小游戏
js实现简单的俄罗斯方块小游戏 开始 1. 创建一个宽为 200px,高为 360px 的背景容器 <!DOCTYPE html> <html lang="en" ...
- VMware虚拟机提示“以独占方式锁定此配置文件失败”!!!
VMware异常关闭后再次启动提示"以独占方式锁定此配置文件失败"!!! 前几日在使用VMware虚拟机的时候,虚拟机突然出现了卡顿,然后就把电脑关机了重启,结果再次打开虚拟机的时 ...
- 浅析Linux启动流程
Linux系统启动流程 Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程.了解 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助 ...
- 。SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性。而 SLO,Service Level Objective,服务等级目标,指的就是我们设定的稳定性目标,比如“几个 9”这样的目标。
.SLI,Service Level Indicator,服务等级指标,其实就是我们选择哪些指标来衡量我们的稳定性.而 SLO,Service Level Objective,服务等级目标,指的就是我 ...
- linux系统层面调优
linux系统层面调优和常见的面试题 - 云+社区 - 腾讯云 https://cloud.tencent.com/developer/article/1664287
- ts中提示“绑定元素“routes”隐式具有“any”类型”
思考单独的.ts和typescript框架在vscode层的差异,想想只有launch.json和tsconfig.json,一个个属性过去后,发现是tsconfig.json配置项"noI ...
- Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解
Java基础图解,JVM,线程,Spring,TCP,SpringMVC等开发体系图解 1.Java虚拟机运行时数据区图 2. 堆的默认分配图 3.方法区结构图 4.对象的内存布局图 5.对象头的Ma ...
- Java——I/O操作之拷贝文件
功能描述: 利用文件输入输出流编写一个实现文件拷贝的程序,源文件名和目标文件名通过控制台输入. public static void main(String[] args) { Scanner in= ...
- 深复制VS浅复制(MemberwiseClone方法介绍)
MemberwiseClone方法,属于命名空间System,存在于程序集 mscorlib.dll中.返回值是System.Object.其含义是:创建一个当前object对象的浅表副本. MSDN ...
- ASP.NET Core默认容器实现Controller的属性注入
仅针对Controller的属性注入: 使用默认容器,不依赖第三方库: 故事背景 闲来无事给项目做优化,发现大多数Controller里面都会用到Logger和AutoMapper,每个Contr ...