Quantcast
Viewing all articles
Browse latest Browse all 9596

Python数据类型之“序列概述与基本序列类型(Basic Sequences)”

列是指有序的队列,重点在"有序"。

一、python中序列的分类

Python中的序列主要以下几种类型:

3种基本序列类型(Basic Sequence Types):list、tuple、range 专门处理文本的附加序列类型(Text Sequence Types):str 专门处理二进制数据的附加序列类型(Binary Sequence Types): bytes、bytearray、memoryview

按照序列是否可被改变分类:

可变序列: list 不可变序列:tuple、str 二、Python中序列支持的操作 1.通用序列操作

这里说的通用序列操作是指大部分可变序列与不可变序列都支持的操作。一般操作包括 增、删、改、查,但是这里说的是包括不可变序列也支持的通用操作,因此只能是“查”操作。

符号说明:

符号 说明 s,t 表示相同类型的序列 n,i,j,k 表示整数数值 x 表示序列s中满足条件约束的任意类型的元素 in(被包含) 和 not in 具有与比较操作相同的优先级 +(连接)和*(重复) 具有与相应数字操作相同的优先级。

序列通用操作及结果说明:

操作 结果 x in s 如果序列s中包含x对象则返回True,否则返回False x not in s 如果序列s中不包含x对象则返回True,否则返回True s + t 对序列s和序列t做连接操作 s * n 或 n * s 等价于 n个s相加 s[i] 表示序列s的第i个元素,i初始值为0 s[i:j] 序列s从下标i到下标j的切片(包含s[i],但不包含s[j]) s[i:j:k] 序列s从下标i到下标j的切片,且步长为k len(s) 序列s的长度 min(s) 序列s中的最小值 max(s) 序列中的最大值 s.index(x[, i[, j]]) x在序列s中从下标i开始到下标j之前范围内第一次出现的位置 s.count(x) x在序列s中出现的总次数 说明:

a) 对于序列来说,其元素的数字类型是不做严格区分的,如True=1=1.0,False=0=0.0;

b) 相同类型的序列也支持比较操作,特别是tuple和list是通过比较对应元素的字典顺序来进行比较的。这意味着要判断两个序列相等,就需要这两个序列中的每个元素都相等,并且这两个序列必须是相同类型且长度相等。

注意:

a) 虽然in 和 not in操作只用于一般情况下的简单容器测试,但一些专用序列(如str,bytes和bytearray)也用于子序列测试。

>>> "ll" in "hello"
True

b) 如果s * n中n小于0,则n会被当做0看待;s * 0的结果是产生一个与s相同类型的空序列。

>>> "ss" * -2
''
>>> ["Tom", "Peter", "Jerry"] * -2
[]
>>> ("Tom", "Peter", "Jerry") * -2
()

c) 对于s * n操作,s序列中的元素没有被复制,他们只是被引用了多次。

>>> lists = [['a']] * 3
>>> lists
[['a'], ['a'], ['a']]
>>> lists[0].append('b')
>>> lists
[['a', 'b'], ['a', 'b'], ['a', 'b']] d) 对于序列的切片操作s[i:j[:k]],如果i或j负数,则索引是相对于字符串的尾部来计算的。如果i是负数,则i相当于len(s)+i,如果j是负责,则j相当于len(s)+j。 >>> [0,1,2,3,4,5,6,7,8,9][-1]
9
>>> [0,1,2,3,4,5,6,7,8,9][-5:-1]
[5, 6, 7, 8]
>>> [0,1,2,3,4,5,6,7,8,9][1:-1]
[1, 2, 3, 4, 5, 6, 7, 8] e) 还是对于序列的切片操作s[i:j[:k]],其中i与j的值有如下几种情况: 如果i或j为负数,则先替换为len(s)+i或len(s)+j再进行如下比较; 如果i或j大于len(s),则其值取len(s); 如果i被忽略或为None,则其值取0; 如果j被或略或为None,则其值取len(s); 如果i的值比j大,则切片结果为空序列。 >>> s = (0,1,2,3,4,5,6,7,8,9)
>>> len(s)
10
>>> s[6:12]
(6, 7, 8, 9)
>>> s[:5]
(0, 1, 2, 3, 4)
>>> s[5:]
(5, 6, 7, 8, 9)
>>> s[9:5]
()

如果步长k被指定,则切片结果中的元素为i,i+k,i+2k,i+3k,...到j的前一个元素停止。k的值不能为0,如果k为None则其值取1。

>>> s[1::2]
(1, 3, 5, 7, 9)
>>> s[0::2]
(0, 2, 4, 6, 8)
>>> s[0::0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: slice step cannot be zero

f) 连接不可变序列时总是会导致产生一个新的对象。这意味着通过重复连接构建序列将会在在总序列长度中具有二次运行时成本。要获得线性运行成本,必须切换到以下选项之一:

如果连接str对象,可以构建一个列表,并在结尾使用str.join()方法进行连接;或者写入io.String()实例并在完成时检索其值; 如果连接bytes对象,可以类似地使用bytes.join()方法或io.BytesIO,或者可以使用bytearray对象进行就地连接;bytearray是可以变的,并且具有有效的覆盖分配机制; 如果连接tuple对象,请使用扩展list的方式替代; 对于其他类型,请查看相关类文档;

g) 一些序列类型(例如 range)仅支持遵循特定模式的元素序列,因此不支持序列的连接和重复操作。

h) 对于s.index(x[, i[, j]])操作,当在序列s中找不到x元素时,index会抛出ValueError。另外,附加参数i,j允许对该序列的子序列进行有效的查找,这大致相当于s[i,j].index(x),但是不会拷贝任何数据且返回的索引值是相对于序列的开始位置而不是相对于切片的开始位置。 3.可变序列类支持的型操作

这里来说下可变序列类型支持,而不可变序列类型不支持的操作。在序列通用操作中主要说明的是“查”操作,这里要说的是可变序列的 "增"、“删”、“改”操作。

符号说明:

符号 说明 s 表示一个可变序列类型的实例 t 表示任何一个可迭代对象 x 表示序列s中满足条件约束的任意类型的元素(例如bytearray只接受满足0 <= x <=255约束的整型值)

可变序列支持的操作及结果说明:

操作 结果 s[i] = x 将序列s中小标为i的元素用x替换 s[i:j] = t 将序列s中从i到j的切片用可迭代对象t的内容替换 s[i:j:k] = t s[i:j:k]中的元素用可迭代对象t的内容替换 s *= n 更新序列s为s的n次重复的结果 del s[i:j] 删除序列s中从i到j的切片,等价于 s[i:j] = [] del s[i:j:k] 从序列s中删除s[i:j:k]中的元素 s.pop() / s.pop(i) 获取序列s中下标为i的元素,并从序列s中删除该元素;i默认为-1,即默认删除并返回序列s的最后一个元素 s.remove(x) 从序列s中移除第一个等于x(即:s[i] == x )的元素;如果x在序列s中不存在,则会抛出ValueError s.clear() 移除序列s中的所有元素,等价于 del s[:] s.append(x) 将x追加到序列s的末尾,等价于 s[len(s):len(s) = [x]] s.extend(t) or s+=t 将可迭代对象t中的元素拼接到序列s的末尾,大部分时候等价于 s[len(s):len(s)] = t s.insert(i,x) 在序列s中下标为i的位置插入x s.copy() 创建一个序列s的浅拷贝,等价于 s[:] s.reverse() 反转序列s中元素的位置,该方法直接对序列s本身做修改(可以节约空间),不会返回被反转后的序列 注意:

a) 可变序列的clear()和copy()方法实在Python 3.3中新加的方法,是为了与dict、set这些不支持切片操作的容器所提供的接口保持一致性。

b) 对于 s = n操作,如果n小于0或等于0,序列s将被清空;另外如果n大于1,序列s并没有被复制,它们只是被引用了多次,这与序列通用操作中的s n是一样的。

不可变序列支持的操作

不可变序列类型通常实现而可变序列没有实现的唯一操作是对内建hash()方法的支持。对内建hash()的支持允许不可变序列(例如tuple)用作dict的键并存储在set和frozenset的实例中。如果尝试hash一个包含不可被hash的数据的不可变序列会导致TypeError错误。

三、Python中的基本序列(basic sequences)

Python中的基本序列类型包括: list、tuple、range,而str属于特殊序列类型,专门用于处理文本序列,这个后面单独进行说明。

1. List(列表) Python中的列表是可变序列,通常用于存储相同类型的数据集合,当然也可以存储不同类型数据。Python中的列表表现形式有点像其他语言中的属组:列表中的元素是用方括号[]括起来,以逗号进行分割。 list类构建函数 class list([iterable]) # 这里的方括号表示iterable是可选项 list的创建方式 使用方括号,用逗号分隔各条目:[],['a'], [a, b, c] 使用类型构造函数:list(), list(iterable) 使用列表生成式:[x for x in iterable] 列表构造函数list(iterable)会创建一个与可迭代对象iterable中的条目及条目顺序都相同的列表。可迭代对象iterable可以是一个序列(sequence)、一个支持迭代操作的容器(container),也可以是一个迭代器对象(iterator object)。如果iterable已经是一个list,则创建一个copy并返回,类似于iterable[:]。如果没有指定参数,列表构造函数会创建一个新的空list, []。 创建list示例: >>> list1 = [] # 空列表
>>> list1
[]
>>> list2 = ["Tom", "Jerry", "Lucy", "Peter"] # 非空列表
>>> list2
['Tom', 'Jerry', 'Lucy', 'Peter']
>>>
>>> list3 = list() # 列表构造函数创建空列表
>>> list3
[]
>>> list4 = list(list2)
>>> list4
['Tom', 'Jerry', 'Lucy', 'Peter']
>>>
>>> list5 = [x for x in list2] # 列表生成式
>>> list5
['Tom', 'Jerry', 'Lucy', 'Peter']

list实现了所有通用(common)序列操作和可变序列(mutable sequence)操作,此外,list还提供了一些附加方法。

list通用序列操作示例 >>> s = [1, 2, 3, 'a', 'b', 'c']
>>> 1 in s # 包含判断

Viewing all articles
Browse latest Browse all 9596

Trending Articles