目录 | 上一节 (1.4 字符串) | 下一节 (1.6 文件)

1.5 列表

本节介绍 Python 原始数据类型列表(list)。 列表是一种有序的集合。

创建列表

使用方括号 [] 来定义列表字面量。

  1. names = [ 'Elwood', 'Jake', 'Curtis' ]
  2. nums = [ 39, 38, 42, 65, 111]

有时候,列表也可以通过其它方法创建。例如:使用字符串的 split() 方法可以将一个字符串拆分为一个列表:

  1. >>> line = 'GOOG,100,490.10'
  2. >>> row = line.split(',')
  3. >>> row
  4. ['GOOG', '100', '490.10']
  5. >>>

列表操作

列表可以存储任何类型的项(译注:item,或者称为元素)。使用 append() 方法添加一个新的项:

  1. names.append('Murphy') # Adds at end
  2. names.insert(2, 'Aretha') # Inserts in middle

使用加号 + 来拼接列表:

  1. s = [1, 2, 3]
  2. t = ['a', 'b']
  3. s + t # [1, 2, 3, 'a', 'b']

列表通过整数进行索引,索引从 0 开始。

  1. names = [ 'Elwood', 'Jake', 'Curtis' ]
  2. names[0] # 'Elwood'
  3. names[1] # 'Jake'
  4. names[2] # 'Curtis'

负索引从列表尾部开始计数:

  1. names[-1] # 'Curtis'

你可以改变列表中的任何项:

  1. names[1] = 'Joliet Jake'
  2. names # [ 'Elwood', 'Joliet Jake', 'Curtis' ]

列表的长度:

  1. names = ['Elwood','Jake','Curtis']
  2. len(names) # 3

成员测试(in, not in):

  1. 'Elwood' in names # True
  2. 'Britney' not in names # True

复制(s * n):

  1. s = [1, 2, 3]
  2. s * 3 # [1, 2, 3, 1, 2, 3, 1, 2, 3]

列表遍历和查找:

使用 for 遍历列表内容:

  1. for name in names:
  2. # use name
  3. # e.g. print(name)
  4. ...

这和其它编程语言的 foreach 语句类似。

为了快速找到某项的位置(索引),使用 index() 函数:

  1. names = ['Elwood','Jake','Curtis']
  2. names.index('Curtis') # 2

如果元素出现不止一次,index() 方法将会返回元素第一次出现的索引。

如果元素没有找到,index() 方法将引发 ValueError 异常。

列表删除

你可以按元素值或者按索引删除元素:

  1. # Using the value
  2. names.remove('Curtis')
  3. # Using the index
  4. del names[1]

移除一个元素不会“留空”。其它的元素将会移动来填充删除元素后腾出的空间。如果元素出现不止一次,remove() 方法将只删除第一次出现的元素。

列表排序

列表可以“原地”排序:

  1. s = [10, 1, 7, 3]
  2. s.sort() # [1, 3, 7, 10]
  3. # Reverse order
  4. s = [10, 1, 7, 3]
  5. s.sort(reverse=True) # [10, 7, 3, 1]
  6. # It works with any ordered data
  7. s = ['foo', 'bar', 'spam']
  8. s.sort() # ['bar', 'foo', 'spam']

如果你想生成一个新的列表,使用 sorted() 函数:

  1. t = sorted(s) # s unchanged, t holds sorted values

列表和数学

警告:列表不是为数学运算而设计的:

  1. >>> nums = [1, 2, 3, 4, 5]
  2. >>> nums * 2
  3. [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
  4. >>> nums + [10, 11, 12, 13, 14]
  5. [1, 2, 3, 4, 5, 10, 11, 12, 13, 14]

特别地,列表无法像 MATLAB, Octave, R 那样表示向量/矩阵。但是,有一些包可以帮助你解决这个问题(例如:numpy)。

练习

在本次练习中,我们尝试使用 Python 的列表数据类型。在上一节中,你使用了包含股票代码的字符串:

  1. >>> symbols = 'HPQ,AAPL,IBM,MSFT,YHOO,DOA,GOOG'

使用字符串的 split() 方法把 symbols 拆分为一个包含股票代码名字的列表:

  1. >>> symlist = symbols.split(',')

练习1.19:提取和重新分配列表元素

尝试一些查找:

  1. >>> symlist[0]
  2. 'HPQ'
  3. >>> symlist[1]
  4. 'AAPL'
  5. >>> symlist[-1]
  6. 'GOOG'
  7. >>> symlist[-2]
  8. 'DOA'
  9. >>>

尝试重新分配一个值:

  1. >>> symlist[2] = 'AIG'
  2. >>> symlist
  3. ['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'DOA', 'GOOG']
  4. >>>

切片:

  1. >>> symlist[0:3]
  2. ['HPQ', 'AAPL', 'AIG']
  3. >>> symlist[-2:]
  4. ['DOA', 'GOOG']
  5. >>>

创建一个空的列表并添加一个元素到其中:

  1. >>> mysyms = []
  2. >>> mysyms.append('GOOG')
  3. >>> mysyms
  4. ['GOOG']

你可以将一个列表的一部分重新分配到另一个列表中。例如:

  1. >>> symlist[-2:] = mysyms
  2. >>> symlist
  3. ['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG']
  4. >>>

当执行此操作时,左手边的列表(symlist)的大小将会被适当调整,以适应右手边的列表。

例如,在上面的实例中,symlist 的最后两项被 mysyms 列表中的单个元素('GOOG')取代。

练习1.20:遍历列表元素

for 循环可以遍历列表这样的序列。通过输入下列的循环并且查看发生了什么来验证这点:

  1. >>> for s in symlist:
  2. print('s =', s)
  3. # Look at the output

练习1.21:成员测试

使用 in 或者 not in 操作符来检查 'AIG''AA',和 'CAT' 是否在 symbols 列表中:

  1. >>> # Is 'AIG' IN the `symlist`?
  2. True
  3. >>> # Is 'AA' IN the `symlist`?
  4. False
  5. >>> # Is 'CAT' NOT IN the `symlist`?
  6. True
  7. >>>

练习 1.22:添加,插入和删除元素

使用 append() 方法把 'RHT' 添加到列表 symlist 的末尾:

  1. >>> # append 'RHT'
  2. >>> symlist
  3. ['HPQ', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG', 'RHT']
  4. >>>

使用 insert() 方法把 'AA' 作为列表的第二个元素插入到列表中:

  1. >>> # Insert 'AA' as the second item in the list
  2. >>> symlist
  3. ['HPQ', 'AA', 'AAPL', 'AIG', 'MSFT', 'YHOO', 'GOOG', 'RHT']
  4. >>>

使用 remove() 方法从列表中删除 'MSFT'

  1. >>> # Remove 'MSFT'
  2. >>> symlist
  3. ['HPQ', 'AA', 'AAPL', 'AIG', 'YHOO', 'GOOG', 'RHT']
  4. >>>

添加一个重复的 'YHOO' 条目到列表的末尾。

注意:列表有重复的值是完全没有问题的:

  1. >>> # Append 'YHOO'
  2. >>> symlist
  3. ['HPQ', 'AA', 'AAPL', 'AIG', 'YHOO', 'GOOG', 'RHT', 'YHOO']
  4. >>>

使用 index() 方法查看 'YHOO' 在列表中的第一个位置:

  1. >>> # Find the first index of 'YHOO'
  2. 4
  3. >>> symlist[4]
  4. 'YHOO'
  5. >>>

统计 'YHOO' 在列表中出现了多少次:

  1. >>> symlist.count('YHOO')
  2. 2
  3. >>>

删除第一次出现的 'YHOO'

  1. >>> # Remove first occurrence 'YHOO'
  2. >>> symlist
  3. ['HPQ', 'AA', 'AAPL', 'AIG', 'GOOG', 'RHT', 'YHOO']
  4. >>>

众所周知,没有方法找到或者删除某个元素在列表中重复出现的所有项。但是,我们将会在第二节看到一种优雅的方式去实现它。

练习1.23:排序

想要对一个列表排序吗?使用 sort() 方法。试试看:

  1. >>> symlist.sort()
  2. >>> symlist
  3. ['AA', 'AAPL', 'AIG', 'GOOG', 'HPQ', 'RHT', 'YHOO']
  4. >>>

想要对一个列表倒序吗?尝试这个:

  1. >>> symlist.sort(reverse=True)
  2. >>> symlist
  3. ['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA']
  4. >>>

注意:对列表排序可以“原地”修改其内容。也就是说,是对列表的元素进行“洗牌”,而不是创建一个新的列表作为结果。

练习 1.24:列表转字符串

想要把一个包含字符串的列表连接到一个字符串中吗?像下面这样使用字符串的 join() 方法实现(注意:这初看起来很有趣):

  1. >>> a = ','.join(symlist)
  2. >>> a
  3. 'YHOO,RHT,HPQ,GOOG,AIG,AAPL,AA'
  4. >>> b = ':'.join(symlist)
  5. >>> b
  6. 'YHOO:RHT:HPQ:GOOG:AIG:AAPL:AA'
  7. >>> c = ''.join(symlist)
  8. >>> c
  9. 'YHOORHTHPQGOOGAIGAAPLAA'
  10. >>>

练习1.25:包含任何内容的列表

列表可以包含任何类型的对象,包括列表(示例:嵌套的列表)。试试看:

  1. >>> nums = [101, 102, 103]
  2. >>> items = ['spam', symlist, nums]
  3. >>> items
  4. ['spam', ['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA'], [101, 102, 103]]

请注意上面的输出,items 是一个包含三个元素的列表,第一个元素是一个字符串,其它两个元素是列表。

你可以通过多个索引操作来访问嵌套列表的项。

  1. >>> items[0]
  2. 'spam'
  3. >>> items[0][0]
  4. 's'
  5. >>> items[1]
  6. ['YHOO', 'RHT', 'HPQ', 'GOOG', 'AIG', 'AAPL', 'AA']
  7. >>> items[1][1]
  8. 'RHT'
  9. >>> items[1][1][2]
  10. 'T'
  11. >>> items[2]
  12. [101, 102, 103]
  13. >>> items[2][1]
  14. 102
  15. >>>

尽管在技术上能够生成非常复杂的列表结构,但作为一般规则,你还是希望保持简单。通常,列表存储类型相同的元素。例如,完全由数字或者文本字符串构成的列表。在同一个列表中混合不同类型的数据,往往会让人感到头痛,因此最好避免这种情况。

目录 | 上一节 (1.4 字符串) | 下一节 (1.6 文件)

注:完整翻译见 https://github.com/codists/practical-python-zh

翻译:《实用的Python编程》01_05_Lists的更多相关文章

  1. 翻译:《实用的Python编程》InstructorNotes

    实用的 Python 编程--讲师说明 作者:戴维·比兹利(David Beazley) 概述 对于如何使用我的课程"实用的 Python 编程"进行教学的问题,本文档提供一些通用 ...

  2. 翻译:《实用的Python编程》README

    欢迎光临 大约 25 年前,当我第一次学习 Python 时,发现 Python 竟然可以被高效地应用到各种混乱的工作项目上,我立即被震惊了.15 年前,我自己也将这种乐趣教授给别人.教学的结果就是本 ...

  3. 翻译:《实用的Python编程》05_02_Classes_encapsulation

    目录 | 上一节 (5.1 再谈字典) | 下一节 (6 生成器) 5.2 类和封装 创建类时,通常会尝试将类的内部细节进行封装.本节介绍 Python 编程中有关封装的习惯用法(包括私有变量和私有属 ...

  4. 翻译:《实用的Python编程》04_02_Inheritance

    目录 | 上一节 (4.1 类) | 下一节 (4.3 特殊方法) 4.2 继承 继承(inheritance)是编写可扩展程序程序的常用手段.本节对继承的思想(idea)进行探讨. 简介 继承用于特 ...

  5. 翻译:《实用的Python编程》01_02_Hello_world

    目录 | 上一节 (1.1 Python) | 下一节 (1.3 数字) 1.2 第一个程序 本节讨论有关如何创建一个程序.运行解释器和调试的基础知识. 运行 Python Python 程序始终在解 ...

  6. 翻译:《实用的Python编程》03_03_Error_checking

    目录 | 上一节 (3.2 深入函数) | 下一节 (3.4 模块) 3.3 错误检查 虽然前面已经介绍了异常,但本节补充一些有关错误检查和异常处理的其它细节. 程序是如何运行失败的 Python 不 ...

  7. 翻译:《实用的Python编程》03_04_Modules

    目录 | 上一节 (3.3 错误检查) | 下一节 (3.5 主模块) 3.4 模块 本节介绍模块的概念以及如何使用跨多个文件的函数. 模块和导入 任何一个 Python 源文件都是一个模块. # f ...

  8. 翻译:《实用的Python编程》03_05_Main_module

    目录 | 上一节 (3.4 模块) | 下一节 (3.6 设计讨论) 3.5 主模块 本节介绍主程序(主模块)的概念 主函数 在许多编程语言中,存在一个主函数或者主方法的概念. // c / c++ ...

  9. 翻译:《实用的Python编程》04_01_Class

    目录 | 上一节 (3.6 设计讨论) | 下一节 (4.2 继承) 4.1 类 本节介绍 class 语句以及创建新对象的方式. 面向对象编程(OOP) 面向对象编程是一种将代码组织成对象集合的编程 ...

随机推荐

  1. uni-app 微信小程序 picker 三级联动

    之前做过一个picker的三级联动功能,这里分享代码给大家 具体代码: // An highlighted block <template> <view> <picker ...

  2. 回归测试_百度百科 https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95

    回归测试_百度百科https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95

  3. 语言反射规则 - The Laws of Reflection

    [译]Go反射的三个原则(官方博客) | seven的分享 https://sevenyu.top/2019/12/21/laws-of-reflection.html wilhg/The-Laws- ...

  4. 在IDEA中用三个jar包链接MongoDB数据库——实现增删改查

    安装Robo 3T连接MongoDB数据库教程:https://blog.csdn.net/baidu_39298625/article/details/98845789 使用Robo 3T操作Mon ...

  5. Python学习【第6篇】:集合的定义和基本方法

    1.概念 (1)不同元素组成 例: s = {1,2,3,4,4,4,4,4,4}print(s)运行结果:{1, 2, 3, 4}因为是不同元素组成,因此去重了 (2)无序 例: s = {&quo ...

  6. Java——Number类

    在平时学习中,当我们需要使用数字的时候,通常使用内置数据类型,如byte,int,long,double等. int i =12; float a = 12.3; 在实际开发中,经常会遇到需要使用对象 ...

  7. GeoMesa 环境搭建

    GeoMesa 环境搭建 版本 虚拟机安装 os centos7 Centos安装 CentOS安装Jdk并配置环境变量 hadoop.hbase环境部署 geomesa_hbase部署 geoser ...

  8. java架构《并发线程中级篇》

    java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...

  9. 数字转金额格式* 999999.99 TO 999,999.99

    /** * 数字转金额格式 * 999999.99 TO 999,999.99 * @param d * @return */ public static String doubleToStr(dou ...

  10. 1.Centos7修改主机名

    1.在CentOS7中,有三种定义的主机名: 静态的(Static hostname):也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名. 瞬态的(Tansient ho ...