ch2 列表和元组

2.1 序列概览

  • python包含六种内建的序列,本章主要讨论列表和元组。其他的内建序列类型有字符串,Unicode字符串,buffer对象和xrange对象。列表和元组的主要区别是列表可以被修改,元组不能。
    列表举例:
>>>edward = ['Edward Gumby',42]

序列也可以包含其他的序列,例如:

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

2.2 通用序列操作

  • 所有序列都可以进行某些特定操作,包括:索引,分片,加,乘以及检查某个元素是否属于序列的成员。除此之外,python还有计算序列长度,找出最大元素和最小元素的内建函数。

2.2.1 索引

  • 序列中元素都是有编号的,从0开始递增,最后一个元素的位置编号是-1。
>>>fourth = raw_input('Year: ')[3]
Year: 2005
>>>fourth
'5'

2.2.2 分片

  • 可以使用分片操作来访问一定范围内的元素,通过冒号相隔的两个索引来实现。第一个索引是需要提取部分的第1个元素的编号,而最后的索引是分片之后剩下部分的第1个元素的编号(第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'

-访问最后三个元素的技巧:

>>>numbers = [1,2,3,4,5,6,7,8,9,10]
>>>numbers[7:10]
[8,9,10]
>>>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]      #返回整个列表
  • 更大的步长
>>>numbers[0:10:1]
[1,2,3,4,5,6,7,8,9,10]
>>>numbers[0:10:2]
[1,3,5,7,9]
>>>numbers[::4]
[1,5,9]

2.2.3 序列相加

  • 两种同种类型的序列才可以进行连接操作。
>>>[1,2,3]+[4,5,6]
[1,2,3,4,5,6]
>>>'hello ' + 'world'
'hello world'

2.2.4 乘法

>>>'python' * 5
'pythonpythonpythonpythonpython'
>>>[42] * 10
[42,42,42,42,42,42,42,42,42,42]
>>>sequence = [None] * 10
>>>sequence
[None,None,None,None,None,None,None,None,None,None]

2.2.5 成员资格

  • in运算符检查元素是否在序列中
>>>permissions = 'rw'
>>>'w' in permissions
True
>>>subject = '$$$ Get rich now!!! $$$'
>>>'$$$' in subject
True

长度、最小值和最大值

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

2.3 列表:python的”苦力“

2.3.1 基本的列表操作

  1. 改变列表:元素赋值。不能为一个位置不存在的元素赋值。
>>>x = [1,1,1]
>>>x[1] = 2
>>>x
[1,2,1]
  1. 删除元素
>>>names = ['Alice' , 'Beth' , 'Cecil' , 'Dee-Dee' , 'Earl']
>>>del names[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']

分片赋值可以不需要替换任何原有元素的情况下插入新的元素。

>>>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]

2.3.3 列表方法

方法是一个与某些对象有紧密联系的函数,对象可能是列表,数字,也可能是字符串或者其他类型的对象。一般方法可以这样调用:对象.方法(参数)
1. append:用来在列表末尾追加新的对象

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

append不是简单返回一个修改过的新列表,而是直接修改原来的列表。
2. count:用来统计某个元素出现的次数

>>>x = [[1,2],1,1,[2,1,[1,2]]]
>>>x.count(1)
2
>>>x.count([1,2])
1
  1. extend:在末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表)
>>>a = [1,2,3]
>>>b = [4,5,6]
>>>a.extend(b)
>>>a
[1,2,3,4,5,6]

这个与连接操作不同,连接操作+返回一个新列表,而extend是在原列表上面修改。
4. index:从列表找出某个值第一个匹配项的索引位置

>>>knights = ['we','are','knights','who','say','ni']
>>>knights.index['who']
4
  1. insert:将对象插入到列表中
>>>numbers = [1,2,3,5,6,7]
>>>numbers.insert(3,'four')
>>>numbers
[1,2,3,'four',5,6,7]
  1. pop:移除最后一个元素,并返回该元素的值
>>>x = [1,2,3]
>>>x.pop()
3
>>>x
[1,2]
>>>x.pop(0)
1
>>>x
[2]

7.remove: 用于移除列表中某个值的第一个匹配项

>>>x = ['to','be','or','not','to','be']
>>>x.remove('be')
>>>x
['to','or','not','to','be']
  1. reverse:将列表中元素反向存放
>>>x = [1,2,3]
>>>x.reverse()
>>>x
[3,2,1]
  1. 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()
>>>print y
None

可以将x的副本赋值给y,再对y排序

>>>x = [4,6,2,1,7,9]
>>>y = x[:] # 不能用y = x,否则y和x都指向同一个列表了
>>>y.sort()
>>>x
[4,6,2,1,7,9]
>>>y
[1,2,4,6,7,9]
  1. 高级排序
    首先自定义比较函数compare(x,y),然后提供给sort函数作为参数。sort函数还有另外两个可选参数,key和reverse。参数key需要提供一个在排序中使用的函数,为每个元素创建一个键,然后所有元素根据键来排序。另一个参数reverse是简单的布尔值,指明是否要进行反向排序。

2.4 元组:不可变序列

  • 元组和列表一样,也是一种序列,只是不能修改。(字符串也是如此)创建元组很简单,用逗号分隔开一些值就创建了元组
>>>1,2,3
(1,2,3)
  • 元组大部分时候是用圆括号括起来的
>>>(1,2,3)
(1,2,3)
  • 加个逗号可以实现只有一个值的元组
>>>42
42
>>>42,
(42,)
>>>(42,)
(42,)
>>>3*(40+2)
126
>>>3*(40+2.)
>>>(42,42,42)

2.4.1 tuple函数

  • tuple函数与list函数基本是一样的,以一个序列作为参数把它转化为元组。
>>>tuple([1,2,3])
(1,2,3)
>>>tuple('abc')
('a','b','c')
>>>tuple((1,2,3))
>>>(1,2,3)

2.4.2 基本元组操作

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

2.4.3 意义

  • 可以在映射中当做键使用——列表不行
  • 作为很多内建函数和方法的返回值存在,也就是说你必须对元组进行处理,只要不尝试修改元组,那么处理元组在绝大多数情况下就是把它们当做列表进行操作。
  • 一般来说,列表更能满足对序列的所有需求

2.5 小结

  • 序列
  • 成员资格:in操作符可以检查一个值是否存在于序列中,对字符串使用in操作符可以查找子字符串
  • 方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值