数据结构:是通过某种方式组织在一起的数据元素的集合,这些元素可以是数字或者字符,甚至可以是其他数据结构

python中最基础的数据结构是序列
python的计数中,第一个元素索引为0,最后一个为-1
python中有六种内建序列,本章讨论列表和元组
列表可以修改,元组不可以修改
列表:
endward=['Edward Gumby','42']
或者:
>>> endward=['Edward Gumby','42']
>>> john=['John Smith','50']
>>> database=[endward,john]
>>> database
[['Edward Gumby', '42'], ['John Smith', '50']]
2.2 通用序列操作
所有序列都可以进行某些特定的操作,包括:索引、分片、加、乘以及检查某个元素是否属于序列的成员,除此之外,python还有计算序列长度、找出最大元素和最小元素的内建函数
迭代:依次对序列中的每个元素重复执行某些操作
2.2.1 索引
序列中的所有元素都是有编号的,从0开始递增,这些元素可以通过编号分别访问,如下:
>>> greeting='Hello'
>>> greeting[0]
'H'
这就是索引,可以通过索引获取元素,所有序列都可以通过这种方式进行索引,最后一个元素是-1
>>> greeting[-1]
'o'
如果一个函数调用返回一个序列,那么就可以直接对返回结果进行索引:
>>> forth=raw_input('year:')[3]
year:2005
>>> forth
'5'
下面代码是一个实例程序,它要求输入年、月(1-12的数字)、日(1-31),然后打印出相应日期的月份名称:
代码清单2-1
months = [
   'January',
   'February',
   'March',
   'April',
   'May',
   'June',
   'July',
   'August',
   'September',
   'October',
   'November',
   'December'
]
endings=['st','nd','rd']+17*['th']\
      +['st','nd','rd']+7*['th']\
      +['st']
year=raw_input('year:')
month=raw_input('month(1-12):')
day=raw_input('day(1-32):')
month_number=int(month)
day_number=int(day)
month_name=months[month_number-1]
ordinal=day+endings[day_number-1]
print month_name+' '+ordinal+','+year
执行结果:
year:1986
month(1-12):9
day(1-32):2
September 2nd,1986
2.2.2分片
访问一定范围内的元素,通过冒号相隔的两个索引来实现:
>>> tag='www.xiaomi.com'
>>> tag[4:10]
'xiaomi'
第一个索引是提取部分的第一个元素的编号,最后的索引是分片之后剩下部分的第一个元素的编号,也就是第二个不包含在分片内
1、优雅的捷径
>>> numbers[-3:]
[8, 9, 10]
>>> numbers[3:]
[4, 5, 6, 7, 8, 9, 10]
>>> numbers[:3]
[1, 2, 3]
>>> numbers[::]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
代码2.2: 分片示列
url=raw_input('please enter the url:')
domain=url[11:-4]
print 'Domain name:'+domain
~                            
url=raw_input('please enter the url:')
domain=url[11:-4]
print 'Domain name:'+domain
2、更大的步长
步长默认为1
>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
步长设置为2
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
如果需要将每4个元素的第一个提取出来,只需要将步长设置为4就行
>>> numbers[::4]
[1, 5, 9]
步长不能为0,但是可以是负数,从右到左提取元素
>>> numbers[::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
2.2.3 序列相加
>>> [1,2,3,4]+[4,5,6]
[1, 2, 3, 4, 4, 5, 6]
>>> 'hello'+'world'
'helloworld'
只有两种相同类型的序列才能进行连接操作
2.2.4 乘法
>>> 'python'*5
'pythonpythonpythonpythonpython'
None、空列表和初始化
空列表:[]
None是python的一个内建值,表示“什么也没有”如果想初始化一个长度为10的空列表:
>>> sequence=[None]*10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
代码清单2-3 序列(字符串)乘法示例
sentence=raw_input("Sentence:")
screen_width=100
text_width=len(sentence)
box_width=text_width+6
left_margin=(screen_width-box_width)//2
left_sentence=(box_width-text_width-1)//2
print
print ' ' * left_margin + '+' + '-' * (box_width-2) + '+'
print ' ' * left_margin + '|' + ' ' * (box_width-2) + '|'
print ' ' * left_margin + '|' + ' ' * left_sentence +  sentence + ' ' * left_sentence + '|'
print ' ' * left_margin + '|' + ' ' * (box_width-2) + '|'
print ' ' * left_margin + '+' + '-' * (box_width-2) + '+'
print
Sentence:Hello,World!
                                        +----------------+
                                        |                           |
                                        |  Hello,World!    |
                                        |                           |
                                        +----------------+
2.2.5 成员资格
为了检查一个值是否在序列中,可以使用运算符in,检查某个条件是否为真,人后返回相应的值:条件为真返回Ture,条件为假返回False,这样的运算符叫做布尔运算符,而真值叫做布尔值。
>>> permissions='rw'
>>> 'w' in permissions
True
>>> 'e' in permissions
False
>>> 'r' in permissions
True
下面代码给出了一个查看用户输入的用户名和PIN码是否存在于列表中的程序,如果存在,在屏幕打印出‘Access granted’
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'
User name:albert
PIN code:1234
Access granted
2.2.6 长度、最小值和最大值
len 返回序列中所包含元素的数量
min和max分别返回最大和最小的元素
>>> numbers=[100,34,678]
>>> len(numbers)
3
>>> max(numbers)
678
>>> min(numbers)
34
2.3 列表:Python的“苦力”
2.3.1 list函数
使用字符串创建列表
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
2.3.2 基本的列表操作
可以使用所有适用于序列的标准操作
1、元素赋值:使用索引标记来为某个特定的、位置明确的元素赋值,注意,不可以为不存在的位置赋值
>>> x=[1,2,3]
>>> x[2]=14
>>> x
[1, 2, 14]
2、删除元素:使用del语句
>>> del x[2]
>>> x
[1, 2]
3.分片操作
>>> name=list('perl')
>>> name
['p', 'e', 'r', 'l']
>>> name[2:]=list('123456')
>>> name
['p', 'e', '1', '2', '3', '4', '5', '6']
不替换的情况下插入新的元素:
>>> numbers=[1,5]
>>> numbers[1:1]=[2,3,4]
>>> numbers
[1, 2, 3, 4, 5]
也可以通过赋值来删除元素
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:2]=[]
>>> numbers
[1, 3, 4, 5]
2.3.3 列表方法
方法是一个与某些对象有紧密联系的函数,对象可以是列表、数字,也可以是字符串或者其他类型的对象,方法可以这样调用:
对象.方法(参数)
1、append 用于在列表末尾追加新的对象:
>>> numbers
[1, 3, 4, 5, 2]
>>> numbers.append(12)
>>> numbers
[1, 3, 4, 5, 2, 12]
2count 统计某个元素在列表总出现的次数
>>> numbers
[1, 3, 4, 5, 2, 12, 12, 12, 12, 12]
>>> numbers.count(12)
5
3、extend 可以在列表的末尾一次性追加另一个序列的多个值,也就是可以用新列表扩展原有的列表:
num=[6,7,8,9]
>>> numbers.extend(num)
>>> numbers
[1, 3, 4, 5, 2, 12, 12, 12, 12, 12, 6, 7, 8, 9]
4、index
用于从列表中找出某个值的第一个匹配项的索引位置:
>>> numbers
[1, 3, 4, 5, 2, 12, 12, 12, 12, 12, 6, 7, 8, 9]
>>> numbers.index(2)
4
5 insert 用于将对象插入到列表中:
numbers.insert(3,'five')
>>> numbers
[1, 3, 4, 'five', 5, 2, 12, 12, 12, 12, 12, 6, 7, 8, 9]
6 pop 移除列表中的一个元素,某人是最后一个,并返回该元素的值
>>> numbers
[1, 3, 4, 'five']
>>> numbers.pop()
'five'
>>> numbers
[1, 3, 4]
pop是唯一一个既可以修改列表又返回元素值的列表方法(除去None)
7 remove 用于移除列表中某个值的第一个匹配项:
>>> numbers
[1, 3, 4, 'five', 5, 2, 12, 12, 12, 12, 12, 6, 7, 8, 9]
>>> numbers.remove(5)
>>> numbers
[1, 3, 4, 'five', 2, 12, 12, 12, 12, 12, 6, 7, 8, 9]
8 reverse 将里表中的元素反向存储
>>> numbers
[1, 3, 4, 'five', 2, 12, 12, 12, 12, 12, 6, 7, 8, 9]
>>> numbers.reverse()
>>> numbers
[9, 8, 7, 6, 12, 12, 12, 12, 12, 2, 'five', 4, 3, 1]
9 sort 对列表进行排序,并改变原列表
>>> numbers
[9, 8, 7, 6, 12, 12, 12, 12, 12, 2, 'five', 4, 3, 1]
>>> numbers.sort()
>>> numbers
[1, 2, 3, 4, 6, 7, 8, 9, 12, 12, 12, 12, 12, 'five']
如果需要一个既保留原列表,又有排序好的列表:
先将x的副本赋值给y
>>> x=[3,4,6,8,4,3,6,9,5]
>>> y=x[:]
>>> x
[3, 4, 6, 8, 4, 3, 6, 9, 5]
>>> y
[3, 3, 4, 4, 5, 6, 6, 8, 9]
简单的把值赋给y是没用的,因为这样做是让x和y都指向同一个列表了,另外一种方法是使用sorted函数
>>> y=sorted(x)
>>> y
[3, 3, 4, 4, 5, 6, 6, 8, 9]
>>> x
[3, 4, 6, 8, 4, 3, 6, 9, 5]
10 高级排序
cmp 提供比较函数的默认实现方式:
>>> cmp(1,2)
-1
>>> cmp(1,1)
0
>>> cmp(2,1)
1
sort有另外两个可选的参数:key和reverse ,如果需要使用它们,那么就要通过名字来指定(叫做关键字参数)
x=['adf','uyuu','wweri','sdfsdf','sdfsdf','dssss']
>>> x.sort(key=len)
>>> x
['adf', 'uyuu', 'wweri', 'dssss', 'sdfsdf', 'sdfsdf']
>>> x.sort(key=max)
>>> x
['adf', 'dssss', 'sdfsdf', 'sdfsdf', 'wweri', 'uyuu']
reverse提供简单的布尔值
x=[1,2,3,3,2,1,3]
>>> x.sort(reverse=True)
>>> x
[3, 3, 3, 2, 2, 1, 1]
>>> x.sort(reverse=False)
>>> x
[1, 1, 2, 2, 3, 3, 3]
>>>
2.4元组不可变序列
创建元组:
>>> 1,2,3
(1, 2, 3)
空元祖可以使用()表示,包含一个值的元组:
>>> 1,
(1,)
2.4.1 tuple函数和list函数基本一致,以一个序列作为参数并把它转换为元组
>>> tuple('abc')
('a', 'b', 'c')
2.5 小结
序列:是一种数据结构,包括 列表】字符串和元组,其中列表是可变的,而元组和字符串是不可变的
成员资格:in操作符可以检查一个值是否存在于序列中,对字符串操作-可以查找子字符串
方法:一些内建类型,具有很多有用的方法
2.5.1 本章新函数
cmp(x,y)                 比较两个值
len(seq)          返回序列的长度
list(seq)       把序列转换成列表
max(args)    返回序列或者参数集合中的最大值
min(args)                返回序列或者参数集合中的最小值
reversed(seq)          对序列进行反向迭代
sorted(seq)             返回已排序的包含seq所有元素的列表
tuple(seq)               把序列转换成元组