针对python3的内置数据结构,做了个小结,包括概念、内置方法、示例等内容。
python3的内置数据结构总体分类:
可变对象:
序列类型:列表(list)、字节数组(bytearray)
key-value映射类型:字典(dict)
集合类型:集合(set)
不可变对象:
数值类型:整数(int)、浮点数(float)、复数(j)
序列类型:元组(tuple)、字节(bytes)
其中数值类型、序列类型为线性结构,其在内存中的地址空间是连续分布的。剩下的映射类型、集合类型则是非线性结构。
序列类型:
列表(list):
特点:
列表具有有序、可索引、可修改、可迭代的特点。列表一旦定义其内存中地址分布是连续的。通过索引的偏移量可以较快速的查找到对应的元素。但列表也具有一些缺点,比如列表的数据规模很大情况下,其内置方法(比如remove、insert等)将影响到元素之后的索引位置的调整,其时间复杂度为O(n)。
列表中可以嵌套其他类型数据,比如列表、字典、集合等,但需要注意的是在嵌套复杂类型时,其只是引用对象,做列表复制时需要注意。
定义方式:
定义空列表并赋予给标识符l1
l1 = list()
注意:l1 = list()与l1 = []的区别
如:list(range(10))与[range(10)]
从可迭代对象中元素,初始化一个新列表
l1 = list("hello")
l1 = list(range(10))
l1 = list(b"hello")
list常用内置方法:
1)append
作用:从列表末尾添加新元素,就地修改原来的列表并返回None。
例:
l1 = list(b"hello")
l1.append("a")
2)copy
作用:对一个列表进行浅复制
例:
l2 = l1.copy()
3)pop
作用:默认无索引参数情况,则从尾部移除一个元素,并返回该元素。可以指定参数为某个索引值,则删除该索引对应的元素。如果超出索引范围,则会抛出IndexError异常。
例:
l1.pop()
l1.pop(2)
4)remove
作用:从列表中移除某元素,就地修改列表并返回None。
例:
l1.remove("a")
5)reverse
作用:将列表中的元素进行反序。就地修改列表并返回None。
例:
l1.reverse()
6)sort
作用:将列表中的元素进行排序,默认为升序。就地修改列表并返回None。
例:
l1.sort()
7)insert
作用:在某个索引位置插入某个元素
例:
l1.insert(0, "a")
8)count
作用:统计某元素在列表中出现的次数,并返回次数。
例:
l1.count("a")
9)extent
作用:对现有列表进行扩展,就地修改原来的列表并返回None。
例:
l1.extend(l2)
字符串(str)
特点:
字符串具有有序、可索引、不可修改、可迭代的特点。
定义方式:
s1 = "hello"
str的内置常用方法:
1)partition
作用:以匹配到的第一个分隔符,将字符串分割成三部分(头、分隔符、尾)并返回一个元组。
例:
s2 = s1.partition("l")
2)split
作用:如果没有参数,则默认以空格为分隔符分割,并返回一个列表。若指定分隔符,则会匹配到所有分隔符并分割。
例:
s1 = "hello world"
s2 = s1.split()
3)strip
作用:默认从两端去除空格、\t、\r、\n等转义字符。可指定去除字符元素。最后返回一个字符串副本。
例:
s1 = "\thello hello\n"
s1.strip()
4)rjust, ljust, center
作用:对字符串进行对齐(右对齐,左对齐,居中),位置参数:总字符长度。默认参数:(可选)默认为空格,可以指定填充字符。
例:
s2 = s1.rjust(20, "+")
s2 = s1.ljust(20, "+")
s2 = s1.center(20, "+")
5)encode
作用:将字符串以指定格式进行编码并返回相应的字节码。默认为utf-8编码。
例:
s2 = s1.encode()
6)isalpha、isalnum、isdigit、isdecimal、isnumeric
作用:判断字符串的组成,并返回布尔值。
7)replace
作用:替换指定元素,并返回一个新字符串
例:
s3 = a.replace("o", "0")
元组(tuple)
特点:
元组具有有序、不可修改、可索引、可迭代的特点。
定义方式:
t1 = (1, 2, 3, 4)
或
l1 = ["a", "b"]
t1 = tuple(l1)
字节码(bytes、bytearray)
特点:
在python3中,字节码从字符串中独立出来。字节码在内存中是以一系列0与1组成。
bytes:具有有序、不可修改、可迭代的特点
bytearray:具有有序、可修改、可迭代的特点
定义方法:
bytes:
# 初始化一个指定大小的空字节码
b1 = bytes(int)
# 将str转化为bytes类型,并编码
b1 = bytes("hello", encoding="utf-8")
# 根据可迭代整数数列来定义bytes
b1 = bytes(range(10))
# 生成一个不可变的bytes副本
b2 = bytearray("hello", encoding="utf-8")
b1 = bytes(b2)
bytearray:
与bytes不同,bytearray定义一个可变字节序列。定义方法与bytes类似。
bytes、bytearra的内置常用方法:
bytes方法与str类似
bytearray方法与list类似
1)hex
作用:从bytes对象中创建一个16进制数的字符串。
例:
b3 = bytes.hex(b"abc ABC")
或
b"abc ABC".hex()
2)fromhex
作用:从16进制数组成的字符串中创建bytes。
例:
b1.fromhex("a0c2")
kv映射类型:
字典(dict)
特点:
字典具有无序、key唯一(去重)、可变、可迭代、非线性结构的特点。此外,字典的key是由可hash的元素组成(不可变对象),因此,key经过散列后,通过key进行查询其value值的速度是非常快的。查询的时间复杂度是O(1)。
定义方法:
d1 = {}
或
d1 = dict()
dict内置常用方法:
1)fromkey
作用:从可迭代对象中生成新字典的key,默认value为None(可自定义value值)。
例:
s1 = "hello"
d2 = d1.fromkeys(s1, 0)
2)get
作用:获取key对应的值,若没有找到key,则默认返回None。可以自定义返回值。
例:
d1 = {1: "a"}
d2.get("b", -1)
3)setdefault
作用:判断key是否存在,如果存在则返回对应的value值。如果不存在则新增key与value,默认value为None,可以自行设置默认value值。
例:
d1 = {1: "a"}
d1.setdefault(2, "b")
4)items
作用:返回一个包含字典key-value元素的视图(类集合对象)
例:
d1.items()
5)keys
作用:返回一个包含字典keys的视图(类集合对象)
例:
d1.keys()
6)values
作用:返回一个包含字典values的视图
例:
d1.values()
7)pop
作用:移除指定key并返回其对应值,若key不错在则抛出KeyError异常。
例:
d1.pop(1)
8)popitem
作用:从尾部弹出kv对,并返回kv组成的元组。
例:
d1.popitem()
9)update
作用:对原有的字典进行更新,若新增key与原key相同则会去重且新key对应的value覆盖原key的value。若新增key与原key不重复则字典会新增key-value对。
例:
d1 = {1: 'a', 2: 'b', 3: None}
d1.update({3: "c"})
d1.update({4: "d"})
d1.update({(5, "e"), (6, "f")})
集合类型
集合(set)
特点:
集合具有无序、不重复(去重)、可迭代、可变、非线性结构的特点。集合中的元素均为不可变且可hash的对象(frostset除外),集合查询某元素的时间复杂度为O(1)。
定义方法:
s1 = set()
s1 = {1, 2, 3, 4}
set内置方法:
1)add
作用:向集合中添加元素
例:
s1 = set()
s1.add(1)
2)union
作用:将两个集合合并,并返回新的集合
例:
s1 = {5}
s2 = {1, 2, 3, 4}
s3 = s1.union(s2)
3)update
作用:对原有集合进行更新,返回None。
例:
s1.update(s2)
4)pop
作用:从集合中弹出一个元素,返回元素值。若集合为空,则抛出KeyError异常
例:
s1.pop()
5)remove
作用:从集合中删除指定元素。若元素不存在,则抛出KeyError异常。
例:
s1.remove(1)
6)discard
作用:从集合中删除指定元素。若元素不存在,则不提示。
例:
s1.discard(3)
7)difference(-)
作用:差集。返回该集合与其他集合不同的元素
例:
s1 = {3, 4, 5, 6}
s2 = {1, 2, 3, 4}
s3 = {6, 7, 8, 9}
print(s1.difference(s2, s3))
或
print(s1 - s2 - s3)
8)intersection(&)
作用:交集。返回所有集合中共有的元素
例:
print(s1 & s2)
或
print(s1.intersection(s2))
9)symmetric_difference(^)
作用:对称差。返回所有非交集的元素
例:
s1 = {3, 4, 5, 6}
s2 = {1, 2, 3, 4}
s3 = {6, 7, 8, 9}
print(s1 ^ s2 ^ s3)
或
print(s1.symmetric_difference(s2).symmetric_difference(s3))
10)isdisjoint
作用:判断如果两个集合没有交集,则返回True
例:
print(s1.isdisjoint(s2))
11)issubset
作用:判断是否为子集
例:
s1 = {3, 4, 5, 6}
s4 = {3, 4}
print(s4.issubset(s1))
12)issuperset
作用:判断是否为超集
例:
s1 = {3, 4, 5, 6}
s4 = {3, 4}
print(s1.issuperset(s4))