现在的位置: 首页 > 综合 > 正文

python(二)列表与元组

2014年08月29日 ⁄ 综合 ⁄ 共 4564字 ⁄ 字号 评论关闭

一.序列(sequence):序列中每个元素分配一个序号--元素的位置,也称为索引.第一个索引是0,以此类推.Python有六种内建的序列(列表,元组,字符串,Unicode字符串,buffer對象與xrange對象)

列表與元組的主要區別在於,列表可以修改而元組則不能。也就是說如果要根據要求來添加元素,那麼列表會更好用,而序列不能修改的時候,元組全更合適。序列也可以包含其他的序列。

>>> edward = ['Edward Gumbe',42]
>>> john = ['John Smith',50]
>>> database = [edward,john]
>>> database
[['Edward Gumbe', 42], ['John Smith', 50]]

所有序列類型都可進行某些特定的操作:索引(indexing),分片(sliceing),加(adding),減(multiplying)以及檢查某個元素是否屬於序列的成員,此外還有計算序列的長度,找出最大元素和最小元素的内建函数.

1.1索引:所有的索引都是从0开始递增,可以通过编号分别访问,使用负数索引时,Python会从右边,也就是从最后1个元素开始计数,最后一个元素的编号是-1.

>>> greeting = "Hello"
>>> greeting[0]
'H'
>>> greeting[3]
'l'
>>> greeting[-1]
'o' 

字符串字面值能够直接使用索引而不需要一个变量引用它们.

>>> 'Hello'[1]
'e'
>>> fourth = raw_input("Year:")[3]
Year:2014
>>> fourth
'4'

1.2 分片 索引访问单个元素,而分片操作访问一定范围内的元素,分片通过冒号相隔的2个索引来实现

>>> tag = '<a href="http://www.python.org">Python web site</a>'
>>> tag[9:30]
'http://www.python.org'
>>> tag[32:-4]
'Python web site'

分片操作对于提取序列的一部分是很有用的,而编号在这里十分重要,第一个索引是需要提取的第一个元素的编号,而最后一个索引则是分片之后剩下部分的第1个元素的编号.

>>> numbers = [1,2,3,4,5,6,7,8,9,10]
>>> numbers[3:6]
[4, 5, 6]
>>> numbers[0:1]
[1]

总之:分片操作的实现需要提供两个索引边界,第1个索引是包含在分片内,而第2个则不包含在分片内.

>>> numbers[7:10]
[8, 9, 10]

索引10指向的是第11个元素--这个元素并不存在,却是最后一个元素之后.

>>> numbers[-3:-1]
[8, 9]
>>> numbers[-3:0]
[]
>>> numbers[-3:]
[8, 9, 10]
>>> numbers[:3]
[1, 2, 3]
>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

只要分片中最左边的索引比右边的晚出现在序列中,结果就是一个空的序列,所以如果分片所得部分包括序列的结尾的元素,那么只需置空最后一个元素即可.同样适用于序列开始的元素
在分片的时候,分片的开始与结束需要进行指定,而另一个参数--步长(step length)--通常是隐匿设置,在普通中步长是1,

>>> numbers[::1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[::2]
[1, 3, 5, 7, 9]
>>> numbers[::-2]
[10, 8, 6, 4, 2] 

当然步长不能为0,那样不会向下执行,但是步长可以是负数,即从左到左提取元素.

>>> numbers[1:10:-2]
[]
>>> numbers[10:1:-2]
[10, 8, 6, 4]

总结:开始点的元素包括中结果之中,而结束点的元素不在分片之内.当使用一个负数作为步长时,必须让开始大于结束点.对于一个正数步长,Python会从序列的头部开始向右提取元素,直到最后一个元素,而对于负数步长,则是从序列的结尾部开始向左提到元素,直到第一个元素.

1.3 序列相加 

>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,'+'world!'
'Hello,world!'
>>> 'Hello,'+[1,2,3]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: cannot concatenate 'str' and 'list' objects

列表与字符串是无法连接在一起的,尽管他们都是序列,简单来说:2种相同类型的序列才能相加.

1,4相乘  用数字乘以一个序列会生成一个新的序列,在新的序列中,原来的序列被重复x次

>>> 'python'*5
'pythonpythonpythonpythonpython'
>>> [42]*10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42] 

空列表,None是Python内建值,它的含意是"这里什么都没有",如果想被始化一个长度为10的列表

>>> sequence = [None]*10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]

1.5成员资格
检查一个值是否在序列中,可以使用in运算符.这个运算符检查某个条件是否为真,然后返回相应的值:条件为真返回true,条件为假返回false.

>>> permission = 'rw'
>>> 'w' in permission
True
>>> 'x' in permission
False

1.6 长度,最小值与最大值

内建函数len,min与max非常有用.len返回序列中元素的数量,min与max返回序列中最大值与最小值.

>>> numbers = [12,42,52,13,99,85,25,75,100]
>>> len(numbers)
9
>>> min(numbers)
12
>>> max(numbers)
100

二,列表
2.1 list函数
  字符串不能像列表一样被修改,所以有时根据字符串创建列表会很有用.list适用与所有的序列,而不只是字符串

>>> list('Hello')
['H', 'e', 'l', 'l', 'o']

改变列表:元素赋值与删除元素

>>> x = [1,1,1]
>>> x[1] = 3
>>> x
[1, 3, 1]
>>> del x[2]
>>> x
[1, 3] 

分片赋值:分片是一个非常强大的特性,而分片赋值则更加显示它的强大.

>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:]=list('ar')
>>> name
['P', 'e', 'a', 'r']
>>> name[3:]=list('john')
>>> name
['P', 'e', 'a', 'j', 'o', 'h', 'n']

分片赋值时,可以使用与原序列不等长的序列将分片替换,也可以在不需要替换任何原有元素的情况下插入新的元素

>>> numbers=[1,5]
>>> numbers
[1, 5]
>>> numbers[1:1]=[2,3,4]
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4]=[]
>>> numbers
[1, 5]

列表的方法:方法是一个与某些对象紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其它类型的对象.
append方法不是简单返回一个修改过的新列表,而是直接修改原来的列表.

>>> lst=[1,2,3]
>>> lst
[1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4] 

count方法统计某个元素在列表中出现的次数.

>>> st = ['bo','be','or','not','to','be','to']
>>> st.count('bo')
1
>>> st.count('to')
2

extend方法是在列表末尾一次性追加另一个序列中的多个值.

>>> a = [1,2,4]
>>> b = [4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 4, 4, 5, 6]
看起来有点像连接操作,区别中于,extend方法修改了扩展的序列,而原始连接操作不然,它会返回一个全新的列表
>>> a = [1,2,4]
>>> b = [4,5,6]
>>> a+b
[1, 2, 4, 4, 5, 6]
>>> a
[1, 2, 4]

index方法用于从列表中找出某个值在第一个匹配项的索引位置

>>> knights = ['we','are','the','knights','who','say','ni']
>>> knights.index('who')
4
>>> knights.index('ke')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 'ke' is not in list

insert方法用于将对象插入到列表中

>>> numbers = [1,2,4,5,6,7]
>>> numbers.insert(3,'four')
>>> numbers
[1, 2, 4, 'four', 5, 6, 7]

pop方法会移除列表中一个元素(默认是最后一个),并且返回该元素的值

>>> x = [1,2,3]
>>> x.pop()
3
>>> x
[1, 2]
>>> x.pop(0)
1
>>> x
[2] 

remove方法用于移除列表中某个值的第一个匹配项

>>> x = ['to','be','or','not','to','be']
>>> 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 "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

erverse方法将列表中的元素反向存放

>>> x = [1,2,3,7,1]
>>> x.reverse()
>>> x
[1, 7, 3, 2, 1]

sort方法用于在原位置对列表进行排序,意味着改变原来的列表,从而让其中的元素能按一定顺序排列,而不是简单的返回一个已排序的列表副本

>>> x
[1, 7, 3, 2, 1]
>>> x.sort()
>>> x
[1, 1, 2, 3, 7]

如果即要保留原来的列表,又要获取新的排序后的列表则用sorted

>>> x
[1, 7, 3, 2, 1]
>>> x.sort()
>>> x
[1, 1, 2, 3, 7]

元组  元组与列表一样,也是一种序列,唯一不同的是元组不能修改,创建元组有逗号,一般需要小括号.

>>> 1,2,3
(1, 2, 3)
>>> (1,2,3)
(1, 2, 3)
>>> ()
()
>>> 2,
(2,)
>>> 3*(40+2)
126
>>> 3*(40+2,)
(42, 42, 42)

tuple函数:以一个列表为参数,将序列转换成元组.元组的分片还是元组

>>> tuple([1,2,4,23])
(1, 2, 4, 23)
>>> x = 1,2,3
>>> x[1]
2
>>> x[0:2]
(1, 2)

抱歉!评论已关闭.