第2章 Python笔记 列表和元组

来源:互联网 发布:淘宝标题改了有影响吗 编辑:程序博客网 时间:2024/05/16 10:11

一、序列

Python中最基本的数据结构是序列。序列中的每一个元素被分配一个序号——即元素的位置,也称为索引。第一个索引为0,第二个为1....序列中的最后一个元素标记为-1,倒数第二个为-2,以此类推。

Python包含6种内建序列,其中最常用的两种类型:列表和元组。其他的内建序列类型有字符串、Unicode字符串、buffer对象和xrange对象。列表和元组的区别在于列表可以修改而元组不可以修改。

二、列表

列表的各个元素通过逗号分隔,写在方括号中。

edward=['Esward Gumby',42]
序列也可以包含其他的序列

edward=['Esward Gumby',42]john=['John Smith',50]database=[edward,john]database[['Esward Gumby', 42], ['John Smith', 50]]

注意:在Python中除了序列这一数据结构还包括一种名为容器的数据结构。容器基本上是包含其他对象的任意对象。序列(例如列表和元组)和映射(例如字典)是两类主要的容器。序列中每个元素都有自己的编号,而映射中的每个元素则有一个名字(也称为键)。

三、通用序列操作

1、索引

1.1 序列可以通过索引获取元素。

>>> greeting='Hello'>>> greeting[0]'H'>>> greeting[-1]'o'>>> greeting[4]'o'>>> greeting[-2]'l'>>> 'Hello'[1]'e'
注意:字符串就是一个由字符组成的序列,所以字符串可以直接使用索引,而不需要一个变量引用。其实使用变量引用和不使用变量引用效果是一样的。
1.2 如果一个函数调用返回了一个序列,那么可以直接对返回结果进行索引操作。

>>> fouth=raw_input('Year: ')[3]Year: 2005>>> fouth'5'
2、分片
2.1 分片操作可以访问一定范围内的元素,通过冒号隔开的两个索引来实现:

>>> numbers=[1,2,3,4,5,6,7,8,9,10]>>> numbers[3:6][4, 5, 6]
在分片的过程中,第一个索引的元素包含在分片内,而第二个索引的元素不包含在分片内。简言之,包头不包尾。

2.2 实际上只要分片中最左边的索引比它右边的晚出现在序列中,结果就是一个空序列,也可以理解为索引为顺序为倒序的时候就会得到空序列。如:

numbers[-3:0][]
上述代码中,倒数第三个比第一个出现的晚,所以得到一个空的序列。

2.3 当置空最后一个索引时可以得到包括序列结尾的元素:

>>> numbers[-3:][8, 9, 10]
这种方法同样适用于序列开始的元素:

>>> numbers[:3][1, 2, 3]
将两个索引都置空的话可以得到整个序列:
>>> numbers[:][1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2.4 步长

通常分片中的步长都是隐式设置的,在普通的分片中步长为1:

>>> numbers[0:10:1][1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
上式步长是显式设置步长为1,也可以设置步长为2:

>>> numbers[0:10:2][1, 3, 5, 7, 9]
步长不可以是0(不会执行),但是步长可以为负数,此时分片从右到左提取元素:
>>> numbers[8:3:-1][9, 8, 7, 6, 5]>>> numbers[10:0:-2][10, 8, 6, 4, 2]
>>> numbers[0:10:-2][]>>> numbers[::-2][10, 8, 6, 4, 2]
总结:当使用一个负数作为步长时,必须让开始点(开始索引)大于结束点。在开始点和结束点不明确时,步长如果为正数,Python会从序列的头部开始向右提取元素,直至最后一个元素;如果步长为负数,则是从序列的右边到左边提取元素,直至第一个元素。
3、序列相加

使用加运算符可以进行序列的连接操作,但是只有两种相同类型的序列才能进行连接操作。

>>> [1,2,3]+[4,5,6][1, 2, 3, 4, 5, 6]>>> 'Hello, '+'world''Hello, world'>>> [1,2,3]+'world'Traceback (most recent call last):  File "<pyshell#14>", line 1, in <module>    [1,2,3]+'world'TypeError: can only concatenate list (not "str") to list
4、乘法

4.1 用数字x乘以一个序列会生成新的序列,而在新的序列中,原来的序列将被重复x次。

>>> 'python'*5'pythonpythonpythonpythonpython'>>> [42]*10[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
4.2 空列表可以用两个中括号表示([]),但是如果想初始化一个长度为10的列表,可以使用Python的内建值None,None的意思是“这里什么也没有”。

>>> sequence=[None]*10>>> sequence[None, None, None, None, None, None, None, None, None, None]
5、成员资格

in运算符是布尔运算符,返回布尔值,该运算符可以检查一个值是否存在序列中。该运算符会检查一个对象是否为某个序列(或者其他的数据集合)的成员。

>>> permissions='rw'>>> 'w' in permissionsTrue>>> 'x' in permissionsFalse>>> users=['mlh','foo','bar']>>> raw_input('Enter your user name: ') in usersEnter your user name: mlhTrue>>> subject='$$$ Get rich now!!!$$$'>>> '$$$' in subjectTrue
6、长度、最小值和最大值

len函数返回序列中所包含元素的数量,min函数和max函数则分别返回序列中的最小和最大的元素。

>>> numbers=[100,34,678]>>> len(numbers)3>>> max(numbers)678>>> min(numbers)34>>> min(9,3,2,5)2>>> max(2,3)3
max和min函数也可以以多个数字直接俄作为参数。

四、列表:Python的“苦力”
1、list函数

因为字符串不能被修改,所以有时可以利用list函数根据字符串创建列表。

>>> list('Hello')['H', 'e', 'l', 'l', 'o']
注意,list函数适用与所有的序列
2、基本的列表操作

2.1 元素赋值

列表在赋值时(列表是可以修改的),需要通过索引确定赋值的位置。

>>> x=[1,1,1]>>> x[1]=2>>> x[1, 2, 1]
2.2 删除元素

删除元素使用del语句实现

>>> names=['Alice','Beth','Cecil','Dee-Dee','Earl']>>> del names[2]>>> names['Alice', 'Beth', 'Dee-Dee', 'Earl']
2.3 分片赋值

>>> name=list('Perl')>>> name['P', 'e', 'r', 'l']>>> name[2:]=list('ar')>>> name['P', 'e', 'a', 'r']
也可以使用与原序列不等长的序列进行分片赋值:

>>> name=list('Perl')>>> name[1:]=list('python')>>> name['P', 'p', 'y', 't', 'h', 'o', 'n']
分片赋值也可以在不需要替换原有元素的情况下插入新的元素:

>>> numbers=[1,5]>>> numbers[1:1]=[2,3,4]>>> numbers[1, 2, 3, 4, 5]
也可以通过分片赋值删除元素:

>>> numbers[1, 2, 3, 4, 5]>>> numbers[1:4]=[]>>> numbers[1, 5]
3、列表方法

方法是一个与某些对象有紧密联系的函数,对象可能是列表、数字,也可能是字符串或者其他类型的对象。方法的调用为:对象.方法(参数)

3.1 append方法可以在列表末尾处追加新的对象:

>>> lst=[1,2,3]>>> lst.append(4)>>> lst[1, 2, 3, 4]
append方法不单单只是简单返回一个修改过的新列表,事实上是直接修改原来的列表。

3.2 count方法用于统计某个元素在列表中出现的次数:

>>> ['to','be','or','not','to','be'].count('to')2>>> x=[[1,2],1,1,[2,1,[1,2]]]>>> x.count(1)2>>> x.count([1,2])1
3.3 extend方法可以用新列表扩展原有的列表,也就是可以在列表的末尾一次性追加另一个序列的多个值。

>>> a=[1,2,3]>>> b=[4,5,6]>>> a.extend(b)>>> a[1, 2, 3, 4, 5, 6]
extend方法和原始的连接不同之处在于,extend修改了被扩展的序列,而原始的连接则返回了一个新的列表:
>>> a=[1,2,3]>>> b=[4,5,6]>>> a+b[1, 2, 3, 4, 5, 6]>>> a[1, 2, 3]
3.4 index方法用于从列表中找出某个值第一个匹配项的索引位置:

>>> knights=['we','are','the','knights','who','say','ni']>>> knights.index('who')4
3.5 insert用于将对象插入到列表中:

>>> numbers=[1,2,3,5,6,7]>>> numbers.insert(3,'four')>>> numbers[1, 2, 3, 'four', 5, 6, 7]
3.6 pop方法会移除列表中的一个元素(默认是最后一个),并且返回该元素的值:
>>> x=[1,2,3]>>> x.pop()3>>> x[1, 2]>>> x.pop(0)1>>> x[2]
pop方法是唯一一个既能修改列表又能返回元素值(除了None)的列表方法,使用pop可以实现一种常见的数据结构——栈。
3.7 remove方法用于移除列表中某个值的第一个匹配项,是一个没有返回值的原位置改变方法。
>>> x=['to','be','or','not','to','be']>>> x.remove('be')>>> x['to', 'or', 'not', 'to', 'be']>>> x.remove('bee')Traceback (most recent call last):  File "<pyshell#3>", line 1, in <module>    x.remove('bee')ValueError: list.remove(x): x not in list
如上述代码所示,只是移除了第一次出现的值,对于不存在于列表中的值(如例子中的“bee”)是不会移除的。

3.8 reverse方法将列表中的元素反向存放。

>>> x=[1,2,3]>>> x.reverse()>>> x[3, 2, 1]
如果需要对一个序列进行方向迭代,可以使用reversed函数。这个函数返回一个迭代器。

3.9 sort方法用于在原位置对列表进行排序。该方法会改变原来的列表,而不是简单的返回一个已排好序的列表副本。该方法改变列表,但是没有返回值。

>>> x=[4,6,2,1,7,9]>>> x.sort()>>> x[1, 2, 4, 6, 7, 9]
>>> x=[4,6,2,1,7,9]>>> y=x.sort()#Don't do this!>>> print yNone
上述第二段程序,由于sort方法没有返回值,所以y打印为None。如果需要排好序之后的副本又不改变原列表可以按照如下方式去做。

>>> x=[4,6,2,1,7,9]>>> y=x[:]>>> y.sort()>>> x[4, 6, 2, 1, 7, 9]>>> y[1, 2, 4, 6, 7, 9]
如果只是简单的把x赋值给y是没有用的,因为这样会让x和y指向同一个列表:

>>> y=x>>> y.sort()>>> x[1, 2, 4, 6, 7, 9]>>> y[1, 2, 4, 6, 7, 9]
另一种获取已排序的列表副本的方法是使用sorted函数

>>> x=[4,6,2,1,7,9]>>> y=sorted(x)>>> x[4, 6, 2, 1, 7, 9]>>> y[1, 2, 4, 6, 7, 9]
3.10 高级排序

如果希望元素按照特定的方式进行排序,可用compare(x,y)的形式进行自定义比较函数。compare(x,y)中,如果x>y返回正数,x<y返回返回负数,x=y返回0(根据自己的定义)。定义好函数后就可以提供给sort方法作为参数了。

>>> cmp(42,32)1>>> cmp(99,100)-1>>> cmp(10,10)0>>> numbers=[5,2,9,7]>>> numbers.sort(cmp)>>> numbers[2, 5, 7, 9]
上述程序不是很懂,后期在查阅资料时进行更新,目前看来compare和cmp应该不是同一个函数,好像compare可以自己定义

sort方法的另外两个可选参数为——key和reverse。这两个参数必须提供一个在排序过程中使用的函数。通过为每个元素创建一个键,然后所有元素根据键来排序。比如根据长度排序,可以使用len作为键函数:

x=['aardvark','abalone','acme','add','aerate']>>> x.sort(key=len)>>> x['add', 'acme', 'aerate', 'abalone', 'aardvark']
关键字参数reverse是布尔值,用来指明列表是否要进行反向排序。

>>> x=[4,6,2,1,7,9]>>> x.sort(reverse=True)>>> x[9, 7, 6, 4, 2, 1]
五、元组

1、创建元组

使用逗号分隔一些值后就会自动创建元组,大部分时候使用圆括号括起来:

>>> 1,2,3(1, 2, 3)
>>> (1,2,3)(1, 2, 3)
即使元组只有一个值时也要加上逗号,只是添加括号是不行的,比如(42)和42是一样的。

>>> 4242>>> 42,(42,)>>> (42,)(42,)
>>> 3*(40+2)126>>> 3*(40+2,)(42, 42, 42)
空元组为一个():
>>> ()()
2、tuple函数

tuple函数是以一个序列作为参数并把它转换为元组:

>>> tuple([1,2,3])(1, 2, 3)>>> tuple('abc')('a', 'b', 'c')>>> tuple((1,2,3))(1, 2, 3)
3、元组的操作

>>> x=1,2,3>>> x[1]2>>> x[0:2](1, 2)
注意:元组的分片还是元组。



































原创粉丝点击