写点什么

翻译:《实用的 Python 编程》01_05_Lists

用户头像
codists
关注
发布于: 2021 年 02 月 17 日
翻译:《实用的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 endnames.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 valuenames.remove('Curtis')
# Using the indexdel names[1]
复制代码


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


列表排序


列表可以“原地”排序:


s = [10, 1, 7, 3]s.sort()                    # [1, 3, 7, 10]
# Reverse orders = [10, 1, 7, 3]s.sort(reverse=True) # [10, 7, 3, 1]
# It works with any ordered datas = ['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 文件)]


发布于: 2021 年 02 月 17 日阅读数: 9
用户头像

codists

关注

公众号:编程人 2021.01.14 加入

Life is short, You need Python

评论

发布
暂无评论
翻译:《实用的Python编程》01_05_Lists