数据结构:是通过某种方式组织在一起的数据元素的集合。这些数据元素可以使数字或者字符,甚至可以是其他数据结构。
在python中,最基本的数据结构是序列。序列中的每个元素被分配一个序号—即元素的位置,也称为索引,第一个索引是0,第二个是1,以此类推。
序列概览:
python包含6种内建的序列:列表和元组,字符串,Unicode字符串、buffer对象和xrange对象。
列表和元组的主要区别在于,列表可以修改,元组则不能。
序列可以用于表示包含某种信息,也可以包含其他序列,如:
>>> yunmeng=[‘jiangchengchengcheng’,149]
>>> wudang=[‘banzang’,109]
>>> database=[yunmeng,wudang]
>>> database
[[‘jiangchengchengcheng’, 149], [‘banzang’, 109]]
通用序列操作
所有序列类型都可以进行某些特定的操作:索引、分片、加、乘以及检查某个元素是否属于序列的成员(成员资格)。除此之外,还有计算序列长度、找出最大元素和最小元素的内建函数。
1.索引
从左至右,从0开始递增
>>> ‘hello’[1]
‘e’
从右至左,从-1开始递减
>>> ‘2018’[-1]
‘5’
如果一个函数调用返回一个序列,那么可以直接对返回结果进行索引操作
>>> fourth=input(‘year: ‘)[3]
year: 2018
>>> fourth
‘8’
2.分片
与使用索引来访问某个元素类似,可以使用分片操作来访问一定范围内的元素。分片通过冒号相隔的两个索引来实现。
需要访问最后2个元素:
>>> numbers=[1,2,3,4,5,6,7,8,9]
>>> numbers[ :2]
[1, 2]
分片所得部分包括序列结尾的元素:
>>> numbers[5: ]
[6, 7, 8, 9]
从编号2到分片之后剩下部分的第1个元素的编号为5的元素:
>>> numbers[3:5]
[4, 5]
复制整个序列:
>>> numbers[ : ]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
更大的步长(步长是1—分片操作就是按照这个步长逐个遍历序列的元素,然后返回开始和结束点之间的所有元素)
>>> numbers[0:10:1]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> numbers[2:5:2]
[3, 5]
步长不能为0,但是可以使负数,即从右至左提取元素:
>>> numbers[8:3:-1]
[9, 8, 7, 6, 5]
>>> numbers[0:10:-2]
[ ]
3.序列相加
列表和字符串无法连接在一起,两种相同类型的序列才能进行连接操作。
>>> [1,2,3]+[4,5,6]
[1, 2, 3, 4, 5, 6]
>>> ‘hello,’+’world!’
‘hello,world!’
>>> [1,2,3]+’world!’
TypeError: can only concatenate list (not “str”) to list
4.乘法
用数字x乘以一个序列会生成新的序列,在新的序列中,原来的序列将被重复x次。
>>> ‘python’*5
‘pythonpythonpythonpythonpython’
>>> [18]*5
[18, 18, 18, 18, 18]
初始化空列表
>>> sequence=[None]*10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]
5.成员资格
为了检查一个值是否在序列中,可以用in运算符(布尔运算符)。检查某个条件是否为真,然后返回相应的值:条件为真返回True(布尔值),为假返回False。
>>> numbers=[‘one’,’two’,’three’]
>>> input(‘choose a number: ‘)in numbers
choose a number: one
True
6.长度、最大值、最小值
内建函数len、min和max。
>>> numbers=[32,1,666]
>>> len(numbers)
3
>>> max(numbers)
666
>>> min(numbers)
1
>>> max(1,6)
6
基本的列表操作
1.list函数
因为字符串不能像列表一样被修改,所以有时根据字符串创建列表会很有用。适用于所有类型的序列。
>>>list(‘hello’)
[‘h’,’e’,’l’,’l’,’o’]
2.改变列表:元素赋值
使用索引标记来为某个特定的、位置明确的元素赋值,不能为一个位置不存在的元素进行赋值。
>>> x=[1,2,1]
>>> x[2]=2
>>> x
[1, 2, 2]
3.删除元素:del语句
列表长度改变
>>> del x[2]
>>> x
[1, 2]
4.分片赋值
分片赋值时可以使用与原序列不等长的序列将分片替换,可以在不需要替换任何原有元素的情况下插入新的元素和删除元素。
>>> name=list(‘perl’)
>>> name[1:]=list(‘ython’)
>>> name
[‘p’, ‘y’, ‘t’, ‘h’, ‘o’, ‘n’]
在不需要替换任何原有元素的情况下插入新的元素:
>>> numbers=[1,5]
>>> numbers[1:1]=[2,3,4]
>>> numbers
[1, 2, 3, 4, 5]
步长不为1时,要替换几个数值等号后面就要写几个数值。([0]*2这样的形式也是可以的):
>>> numbers[1:4:2]=[0,0]
>>> numbers
[1, 0, 3, 0, 5]
利用分片赋值来删除元素:
>>> numbers=[1,2,3,4,5]
>>> numbers[1:4]=[]
>>> numbers
[1, 5]
(步长不为1时会报错ValueError: attempt to assign sequence of size 0 to extended slice of size 2,未解决)
5.列表方法
方法是一个与某些对象有紧密联系的函数,对象可能是列表、数字,也可能是字符串或者其他类型的对象。一般来说,方法可以这样进行调用: 对象.方法(参数)
append:用于在列表末尾追加新的对象
>>> lst=[1,2,3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
count:统计某个元素在列表中出现的次数
>>> [‘to’,’be’,’or’,’not’,’to’,’be’].count(‘to’)
2
extend:在列表的末尾一次性的追加另一个列表中的多个值,即新列表扩展原有的列表(与连接不同的是,此方法修改了被扩展的序列)
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
index:从列表中找出某个值第一个匹配项的索引位置
>>> numbers=[‘one’,’two’,’three’,’four’,’five’,’six’]
>>> songs.index(‘three’)
2
insert:将对象插入到列表中
>>> numbers=[1,2,3,4,5,6]
>>> numbers.insert(4,’five’)
>>> numbers
[1, 2, 3, 4, ‘five’, 6]
pop:移除列表中的一个元素(默认是最后一个),并且返回该元素的值
(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.remove(‘be’)
>>> x
[‘to’, ‘or’, ‘not’, ‘to’, ‘be’]
reverse:列表中的元素反向存放
>>> x=[1,2,3]
>>> x.reverse()
>>> x
[3, 2, 1]
sort:在原位置(意味着改变原来的列表)对列表进行排序
>>> x=[4,7,2,8,5,9]
>>> x.sort()
>>> x
[2, 4, 5, 7, 8, 9]
sort 与 sorted 区别:
sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。
list 的 sort 方法返回的是对已经存在的列表进行操作,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。
高级排序:按照特定的方式进行排序(而不是sort函数默认的方式,即更具python的默认排序规则按升序排列元素)
compare(x,y)函数在x< y时返回负数,在x>y时返回正数,x=y时返回0
>>> cmp(23,24)
-1
>>> cmp(23,22)
1
>>> cmp(23,23)
0
元组:不可变序列
1.创建元组:用逗号分割了一些值,通过圆括号括起来
>>> 1,2,3
(1, 2, 3)
>>> (1,2,3)
(1, 2, 3)
>>> ( )
( )
实现一个值的元组:必须加个逗号,即使只有一个值
>>> 23,
(23,)
>>> (23,)
(,23,)
2.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)
元组的分片还是元组。