根据《python基础教程》学习总结。
列表和元组
在python中,最基本的数据结构是序列(sequence)。序列中的每个元素被分配一个序号-即元素的位置,
也称为索引。
1.序列概况
python包含6中内建的序列,最常用的两种:列表和元组。其他的内建序列类型有字符串、unicode字符串
、buffer对象和xrange对象。
列表和元组的主要区别在于,列表可以修改,元组则不能。
在需要操作一组数值的时候,序列很好用。可以用序列表示数据库中一个人的信息--第一个原色是姓名,第
二个元素是年龄。列表的各个元素通过逗号分隔,写在方括号中,如下例所示:
>>>edward = ['Edward Gumby',42]
2.通用序列操作
所有序列类型都可以进行某些特定的操作。这些操作包括:索引(indexing)、分片(sliceing)、加
(adding)、乘(multiplying)以及检查某个元素是否属于序列的成员(成员资格)。除此之外,python
还有计算序列长度、找出最大元素和最小元素的内建函数。
2.1.索引
序列中的所有元素都是有序号的--从0开始递增。这些元素可以通过编号分别访问。如下例所示:
>>>greeting ='Hello'
>>>greeting[0]
'H'
可以通过索引获取元素。所有序列都可以通过这种方式进行索引。使用负数索引时,python会从右边,
也就是从最后一个元素开始计数。最后一个元素的位置编号是-1(不是-0,因为那会和第一个元素重合)
>>>greeting[-1]
'0'
字符串字面值(就此而言,其他序列字面量亦可)能够直接使用索引,而不需要一个变量引用他们。
两种做法的效果一样的:
>>>'Hello'[1]
'e'
2.2分片
与使用索引来访问单个元素类似,可以使用分片操作访问一定范围的元素。分片通过冒号相隔的两个索引
来实现:
>>>tag[9:30]
'http://www.python.org'
>>>tag[32:-4]
'Python web site'
简而言之,分片操作的实现需要提供两个索引作为边界,第一个索引的元素是包含在分片内的,而第二个则
不包含在分片内。
(1)优雅的捷径
加入访问最后三个元素,如下:
>>>number= [1,2,3,4,5,6,7,8,9,0]
>>>number=[7:10]
[8,9,10]
现在使用更简洁的方法,从列表的结尾开始计数:
>>>number[-3,-1]
[8,9]
最后一个元素无法访问
实际上,如果分片所得部分包括序列结尾的元素,那么,只需要空最后一个索引即可
>>>number[-3:]
[8,9,0]
这种方法同样适用于序列开始的元素:
>>>number[:3]
[1,2,3]
实际上,如果需要复制整个序列,可以将两个索引都置空:
>>>number=[:]
[1,2,3,4,5,6,7,8,9,0]
(2) 更大的步长
进行分片的时候,分片的开始和结束点需要进行制定。而另一个参数-步长-通常都是引式设置的。在普通的分片
中,步长是1,分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素。如果
步长被设置为比1大的数,那么就会跳过某些元素。例如,步长为2的分片包括的是从开始到结束每隔一个的元
素。
>>>number[0,10,2]
[1,3,5,7,9]
numbers[3:6:3]
[4]
当然,步长不能为0,那不会向下执行-但步长可以是负数,即从右到左提取元素
>>>number[8:3:-1]
[9,8,7,6,5]
2.3序列相加
通过使用加号可以进行序列的连接操作:
>>>[1,2,3]+[4,5,6]
[1,2,3,4,5,6]
>>>'Hello,' + 'world!'
'Hello,world!'
列表和字符串是无法连接在一起的,尽管他们都是序列。简单来说,两种相同类型的序列才能进行连接操作。
2.4乘法
用数字x乘以一个序列会产生成新的序列,而在新的序列中,原来的序列将被重复x次。
>>>'python' * 5
'pythonpythonpythonpythonpython'
None、空列表和初始化
空列表可以简单的通过两个中括号进行表示(【】)-里面什么东西也没有。但是,如果想创建一个占用是个元素空间,却不包括任何有用内容的列表,又该怎么办呢?可以像以前那样使用[0]*10.然而有时需要一个值
来代表空值,这时候可以使用None。None是一个Python的内建值 ,它的确切含义是“这里什么也没有”。
如果想初始化一个长度为10的列表,可以这样:
>>>sequence = [None]*10
>>>sequence
[None, None, None, None, None, None, None, None, None, None]
例子:
#!/usr/bin/env python
#-*- coding: utf-8 -*-
#以正确的宽度在居中的“”盒子“内打印一个 句子
#注意,整数除法运算(//)只能用在python2.2以后以及后续版本,在之前的版本中,只使用普通除法(/)
sentence = raw_input("Sentence: ")
screen_width = 80
text_width = len(sentence)
box_width = text_width + 6
left_margin = (screen_width - box_width) //2
print
print ' ' * left_margin + '+' + '-' * (box_width-2)+ '+'
print ' ' * left_margin + '|' + ' ' * text_width + '|'
print ' ' * left_margin + '|' + sentence + '|'
print ' ' * left_margin + '|' + '-' * text_width + '|'
print ' ' * left_margin + '+' + '-' * (box_width-2)+ '+'
print
2.5成员资格
为了检查一个值是否在序列中,可以使用in运算符。这个运算符检查某个条件是否为真,然后返回相应的值:条件
为真返回true,条件为假返回false。这样的运算符叫做布尔运算符,而值叫做布尔值。
例子:
>>>a= 'rw'
>>>'w' in a
Ture
>>>'x' in a
False
>>>users=['mlh','foo','bar']
>>>raw_input('Enter your user name: ') in users
Enter your user name: mlh
True
例子:
database=[
['albert','1234'],
['dilbert','4242'],
['smith','7524'],
['jones','9843']
]
username = raw_input('User name: ')
pin = raw_input('PIN code: ')
if [username,pin] in database: print 'Access granted'
2.6长度、最小值和最大值
内减函数len、min和max非常有用。
len函数返回序列中所包含元素的数量,min函数和max函数则分别返回序列中最大和最小的元素。
>>>numbers = [100,34,678]
>>>len(numbers)
3
>>>max(numbers)
678
>>>min(numbers)
34
>>>max(2,3)
3
3.列表:Python的“苦力”
列表不同于元组和字符串的地方:列表是可变(mutable)--可以改变列表的内容,并且列表有很多有用的专门的
方法。
3.1list函数
因为字符串不能像列表一样被修改,所以有时根据字符串创建列表会很好用。list函数可以实现这个操作:
>>>list('Hello')
['H','e','l','l','o']
注意:list函数适用于所有类型的序列,而不只是字符串。
3.2基本的列表操作
列表可以使用所有适用于序列的标准操作,例如索引、分片、连接和乘法。列表是可以修改的。
(1)改变列表:元素赋值
改变列表是很容易的。
例如:
>>>x=[1,1,1]
>>>x[1]=2
>>>x
[1,2,1]
(2)删除元素
从列表中删除元素也很容易:使用del语句来实现。
例如:
>>>names=['Alice','Beth','Cecil','Dee-Dee','Earl']
>>>del name[2]
>>>names
['Alice','Beth','Dee-Dee','Earl']
(3)分片赋值
分片是一个非常强大的特性,分片赋值操作则更加显现他的强大。
>>>name=list('Perl')
>>>name
['P','e','r','l']
>>>name[2: ]=list('ar')
>>>name
['P','e','a','r']
分片赋值语句可以在不需要替换任何原有元素的情况下插入新的元素。
>>>number=[1,5]
>>>number[1:1]=[2,3,4]
>>>number
[1,2,3,4,5]
这个程序只是“替换”了一个空的分片,因此实际的操作是插入了一个序列。
通过分片赋值来删除元素也是可行的。
>>>number
[1,2,3,4,5]
>>>number[1:4]=[ ]
>>>number
[1,5]
3.3列表方法
方法是一个与某些对象有紧密联系的函数,对象可能是列表、数字,也可能是字符串或者其他类型的对象。方法
可以这样进行调用:
对象.方法(参数)
(1)append
append方法用于在列表末尾追加新的对象:
>>>lst=[1,2,3]
>>>lst.append(4)
>>>lst
[1,2,3,4]
注意:不能使用list作为变量名,因为list是一个内建函数。append方法和其他一些方法类似,只是在恰当位置修改
原来的列表。这意味着,它不是简单返回一个修改过的新表---而是直接修改原来的列表。
(2)count
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)extend
extend方法可以在列表的末尾一次性追加另一个序列中的多个值。换句话说,可以用新列表扩展原有的列表:
>>>a=[1,2,3]
>>>b=[4,5,6]
>>>a.extend(b)
>>>a
[1,2,3,4,5,6]
注意:和append的区别在于,extend不改变原来的表,返回一个全新的列表。
(4)index
index方法用于从列表中找出某个值第一个匹配项的索引位置:
>>>knights=['We','are','the','knights','who','say','ni']
>>>knights.index('who')
4
>>>knights[4]
'who'
(5)insert
insert方法用于将对象插入到列表中:
>>>numbers=[1,2,3,4,5,6,7]
>>>numbers.insert(3,'four')
>>>numbers
[1,2,3,'four',5,6,7]
与extend方法一样,insert方法的操作也可以用分片赋值来实现。
>>>numbers=[1,2,3,4,5,6,7]
>>>numbers=[3:3]=['four']
>>>numbers
[1,2,3,'four',5,6,7]
但是他的可读性不如insert方法。
(6)pop
pop方法会移除列表中的一个元素(默认是最后一个),并且返回该元素的值:
>>>x=[1,2,3]
>>>x.pop()
3
>>>x
[1,2]
>>>x.pop(0)
1
>>>x
[2]
注意:pop方法是唯一一个即能修改列表又返回元素值(None)的列表方法。
pop方法可以实现一种常见的数据结构--栈,python没有入栈方法,但可以使用append方法来代替。pop方法和append方法的操作结果恰好相反,如果入栈(或者追加)刚刚出栈的值,最后得到的结果还是原来的栈。
(7)remove
remove方法用于移除列表中某个值的第一个匹配项:
>>>x=['to','be','or','not','to','be']
>>>.remove('be')
>>>x
['to','or','not','to','be']
注意:只有第一次出现的值被移除了,而不存在于列表中的值是不会移除的。remove是一个没有返回值的原位置
改变方法。他修改了列表却没有返回值,这与pop方法相反。
(8)reverse
reverse方法将列表中的元素反向存放:
>>>x=[1,2,3]
>>>x.reverse()
>>>x
[3,2,1]
(9)sort
sort的方法用于在原位置对列表进行排序。在“原位置排序”意味着改变原来的列表,从而让其中的元素能按一定的
顺序排列,而不是简单的返回一个已排序的列表副本。
>>>x=[4,6,2,1,7,9]
>>>x.sort()
>>>x
[1,2,4,6,7,9]
注意:sort()改变原来的列表,并且返回一个空值None
>>>x=[4,6,2,1,7,9]
>>>y=x.sort()
>>>print y
None
只是简单的把x赋值 给y是没有用的,这样做就让x和y指向同一个列表了。
正确做法:
>>>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]
如果想把一些 元素按相反的顺序排列,可以先使用sort(或者sorted),然后在调用reverse方法,或者也可以
使用reverse方法,或者也可以使用reverse参数。
4.元组:不可变序列
元组与列表一样,也是一种序列。唯一的不同是元组不能修改。创建元组:使用逗号分隔一些值,那么你就自动
创建了元组。元组没有列表一样的方法。
>>>1,2,3
(1,2,3)
元组也是(大部分时候是)通过圆括号括起来的:
>>>(1,2,3)
(1,2,3)
空元组:
>>>()
()
实现包括一个值的元组(必须加个逗号,即使只有一个值):
>>>42
42
>>>42,
(42,)
4.1tuple函数
tuple函数的功能与list函数基本上是一样的:以一个序列作为参数并把它转换为元组。如果参数就是元组,那么
该参数就是元组,那么该参数就会被原样返回:
>>>tuple([1,2,3])
(1,2,3)
>>>tuple('abc')
('a','b','c')
>>>tuple((1,2,3))
(1,2,3)
4.2基本元组操作
元组其实并不复杂--除了创建元组和访问元组元素之外,也没有太多其他操作。元组的分片还是元组,就像列表的
分片还是列表一样。
4.3意义
作用:
元组可以在映射中当作键使用-而列表则不行。
元组作为很多内建函数和方法的返回值才在,也就是说你必须对元组进行处理。只要不尝试修改元组。