Python基本的数据结构-序列
2017-11-28 22:30
375 查看
序列
Python最基本的数据结构是序列,序列的索引从0开始,最后一个元素的序号为-1,倒数第二个为-2。序列包括:列表(可变)、元组、字符串、Unicode字符串、buffer对象和xrange对象。
列表和元组的主要区别是列表可以修改,而元组不能。
序列可以包含其他的序列,如下:
>>> jack = ['jack',42] >>> saint = ['saint',50] >>> db = [jack,saint] >>> db [['jack', 42], ['saint', 50]]
序列的通用操作
有索引、分片、加、乘以及检查某个元素是否属于序列的成员(成员资格)。索引
可以通过索引获取元素:>>> greeting = 'Hello' >>> greeting[0] 'H' >>> greeting[-1] 'o'
分片
使用分片来访问一定范围内的元素,通过冒号隔开的两个索引实现:>>> tag = 'Hello,nice to meet you,nice' >>> tag[0:5] 'Hello'
第一个索引是要提取的第1个元素的编号,包含在分片内;第二个索引不包含在分片内。
>>> numbers[1:-1] [1, 2, 3, 4, 5, 6, 7, 8] >>> numbers[1:9] [1, 2, 3, 4, 5, 6, 7, 8] >>> numbers[1:10] [1, 2, 3, 4, 5, 6, 7, 8, 9]
这里-1代表的是最后一个元素,等同于[1:9],且不会包括最后一个元素。
要想包括最后一个元素,必须提供最后一个元素的下一个元素所对应的索引作为边界。索引10指向了第11个元素,这个元素并不存在,但在最后一个元素之后。
那[-3:-1]又会输出什么呢?
>>> numbers[-3:-1] [7, 8]
输出结果为,从倒数第3个元素到倒数第1个元素。
只要是逆序的(左边的索引比右边的索引晚出现在序列中),结果就是一个空的序列。
>>> numbers[-2:0] []
幸好,如果想得到包括序列结果的元素,只需要将最后一个元素置为空即可:
>>> numbers[1:] [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果需要复制整个序列,将两个索引都置空:
>>> numbers[:] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
分片还可以指定步长,默认是1:
>>> numbers[0::2] [0, 2, 4, 6, 8]
从开始到结束,步长为2。
步长可以是负数
>>> numbers[8:3:-1] [8, 7, 6, 5, 4]
表示逆序提取元素。从序列的尾部开始向左提取元素,直到第一个元素。
序列相加
>>> [1,2,3] + [4,5,6] [1, 2, 3, 4, 5, 6]
相同类型的序列才可以进行相加操作
乘法
>>> 'python' * 3 'pythonpythonpython'
上面会将’python’重复3次。
Python有一个内建值-None。表示什么都没有。结合乘法可以初始化长度为10的空列表:
>>> [None] * 10 [None, None, None, None, None, None, None, None, None, None]
成员资格
使用in运算符检测一个值是否在序列中。返回True或False。
>>> sentence = "have a nice day" >>> 'have' in sentence True >>> 'good' in sentence
列表
前面的例子中多次选用列表。列表是可变的,有很多有用的方法。list函数
>>> list('Hello') ['H', 'e', 'l', 'l', 'o']
基本的列表操作
赋值>>> l = list('Hello') >>> l ['H', 'e', 'l', 'l', 'o'] >>> l[0] = 'Y' >>> l ['Y', 'e', 'l', 'l', 'o']
删除元素
>>> del l[3] >>> l ['Y', 'e', 'l', 'o']
分片赋值
>>> l ['Y', 'e', 'l', 'o'] >>> l[:2] = list('ok') >>> l ['o', 'k', 'l', 'o']
可以一次为多个元素赋值。这里是与原序列等长(长度为2)的赋值,还可以与原序列不等长的赋值。
>>> l ['o', 'k', 'l', 'o'] >>> l[2:] = list('isverygood') >>> l ['o', 'k', 'i', 's', 'v', 'e', 'r', 'y', 'g', 'o', 'o', 'd']
还可以通过分片赋值来删除元素:
>>> l[2:] = [] >>> l ['o', 'k']
列表方法
append用于在列表末尾增加新的对象:
>>> l = [1,2,3] >>> l.append(4) >>> l [1, 2, 3, 4]
注意,append会直接修改原来的列表,而不是返回一个新列表。
count
统计某个元素出现在列表中的次数:
>>> l = [1,2,3,1,1,1] >>> l.count(1) 4
extend
也会修改原列表
在列表的末尾一次性追加另一个序列中的多个值。可以用新列表扩展原来的列表:
>>> a = [1,2,3] >>> b = [4,5,6] >>> a.extend(b) >>> a [1, 2, 3, 4, 5, 6]
和连接操作的区别
这个操作和连接操作(+)很像,但是区别是连接操作不会修改原列表,而是返回一个新的列表:
>>> a = [1,2,3] >>> a + b [1, 2, 3, 4, 5, 6] >>> a [1, 2, 3]
和append函数的区别
我们看一下代码就知道了:
>>> a = [1,2,3] >>> b = [4,5,6] >>> a.append(b) >>> a [1, 2, 3, [4, 5, 6]]
append把b当成一个列表对象加到列表a的末尾。
index
从列表中找出某个值第一个匹配项的索引位置:
>>> a [1, 2, 3] >>> a.index(1) 0 >>> a.index(2) 1
insert
将对象插入到列表中:
>>> a [1, 2, 3] >>> a.insert(1,5) >>> a [1, 5, 2, 3]
注意,这里的操作对象为“对象”。比如,如下:
>>> a.insert(1,[1,2]) >>> a [1, [1, 2], 5, 2, 3]
pop
移除列表的一个元素(默认是最后一个),并返回该元素的值:
>>> a [1, [1, 2], 5, 2, 3] >>> a = [1,2,3] >>> a.pop() 3 >>> a [1, 2] >>> a.pop(0) 1
pop方法是唯一一个既能修改列表又返回元素值的列表方法
使用append和pop可以实现stack
remove
移除列表中某个值的第一个匹配项:
>>> a = list('hi,nice') >>> a ['h', 'i', ',', 'n', 'i', 'c', 'e'] >>> a.remove('i') >>> a ['h', ',', 'n', 'i', 'c', 'e']
reverse
将列表中的元素反向存放:
>>> a = [1,2,3] >>> a.reverse() >>> a [3, 2, 1]
sort
用于在原位置对列表进行排序,会修改原来的列表。
>>> a [3, 2, 1] >>> a.sort() >>> a [1, 2, 3]
如果想要一个排好序的副本,同时又保留原有列表不变的时候。
注意,sort函数修改原列表而不会返回一个新列表,下面的用法是错误的:
>>> a = [3,1,2] >>> b = a.sort() #不要这么做 >>> a [1, 2, 3] >>> print b None
正确的做法是这样:
>>> a = [3,1,2] >>> b = a[:] #把a的副本赋值给b >>> b.sort() >>> b [1, 2, 3] >>> a [3, 1, 2]
还有一个函数可以获取已排序的列表副本-
sorted函数
>>> a = [3,1,2] >>> b = sorted(a) >>> b [1, 2, 3] >>> a [3, 1, 2]
可以通过compare(x,y)的形式自定义比较函数:
x<y返回负数;x=y返回0;x>y返回整数。
Python提供了一个内建的比较函数
cmp
>>> cmp(1,3) -1 >>> cmp(1,0) 1
比较函数可以作为sort方法的参数:
>>> a [3, 1, 2] >>> a.sort(cmp) >>> a [1, 2, 3]
sort方法还有两个可选参数:key和reverse。如果要使用这两个可选参数,那么就要通过名字来指定。(下面会有例子)
参数key和参数cmp类似-必须提供一个在排序过程中使用的函数。
如果要根据元素的长度进行排序,那么可以使用len作为key函数:
>>> a = ['hello','saint','jack','zhang'] >>> a.sort(key=len) >>> a ['jack', 'hello', 'saint', 'zhang']
reverse是布尔值(True,False),默认为false。
指定True来进行从大到小排序:
>>> a = [3,1,2] >>> a.sort(reverse=True) >>> a [3, 2, 1]
元组:不可变序列
字符串也是不可变的简单的创建元组方法:
>>> 1,2,3 (1, 2, 3)
元组大部分时候是通过圆括号括起来的,如下是创建空元祖:
>>> () ()
创建只包含一个值的元组:
>>> 1, (1,) # 是元组! >>> (1) # 这个不是元组 1
元组的分片还是元组:
>>> x = 1,2,3 >>> x[1] # 通过索引访问 2 >>> x (1, 2, 3) >>> x[0:2] (1, 2)
tuple函数
和list函数功能类似,以一个序列作为参数并把它转换为元组:>>> tuple('hello') ('h', 'e', 'l', 'l', 'o') >>> tuple([1,2,3]) (1, 2, 3)
元组的意义
元组可以在映射(和集合的成员)中当左键使用,而列表不行元组作为很多内建函数和方法的返回值
一般来说,列表可能更能满足对序列的所有需求。
相关文章推荐
- python数据结构-序列\序列通用操作\列表(基本操作、方法)
- Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结
- Python学习笔记——基本数据结构
- python 数据结构 元组、列表、字典、序列
- 小白学数据结构——二、树与堆(基本概念及二叉树、二叉堆的python实现)
- Python学习笔记(三)——Python数据结构之序列
- Python基本数据结构
- python基本语法:序列
- Python的语法和基本数据结构
- 基本数据结构的python实现---队列
- 1.python基本数据结构-集合-方法
- Python随身听基础篇03-基本数据结构list和dict
- Python数据结构——序列、字典
- Python快速学习02:基本数据类型 & 序列
- Python新手学习基础之数据结构-序列1
- Python数据类型 -- 基本数据结构习题
- Python数据结构:序列(列表[]、元组())与映射(字典{})语法总结
- Python自学1:Python 基本数据结构:列表、元组、字典
- Python基本数据结构 习题及源码
- python 内置数据结构的基本操作 —— list(2)