四大容器解析
数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。
在Python中,有四大数据结构:列表List、元组Tuple、集合Set、字典Dict
因为软件需要大量的代码去解决需求,简单的代码不一定能解决问题,四大数据结构的结合调用可以完成需要的功能。
一.列表 List
1.什么是列表?
是一种线性表,结构为线性结构。由大量的节点组成,每一个节点都能存储大量的数据。
2.语法结构
通过一对方括号包含起来的数据序列,可以存放重复数据。
因为列表本身是对象,可以进行嵌套处理。
3.如何使用列表/定义列表?
> a = list() #创建了一个空链表
> a
[]
> type(a)
< class 'list'>
> help(list)
4.如何访问列表中的元素?
通过下标,下标从0开始。
注意:如果下标越界了会报错
> a = ([2,4,5,6])
> a
[2, 4, 5, 6]
> a[2]
5
5.遍历元素
for 变量 in 容器:
变量代码中的一个确定的元素
> b
> [1,2,3,4,5,6]
> for i in b:
... print(i)
...
1
2
3
4
5
6
6.列表的长度问题
方法一:全局函数len()
> a
[1,5,6,9]
> b
[1,2,3,4,5,6]
> len(a)
4
> len(b)
6
方法二:使用while循环遍历
> index = 0
> a
[2,4,5,6,7,8,9]
> while index < len(a):
... print(a[index])
... index += 1
...
2
4
5
6
7
8
9
7.列表的常用指令
常用: ‘append’, ‘clear’,‘copy’, ‘count’, ‘extend’, ‘index’, ‘insert’, ‘pop’, ‘remove’, ‘reverse’, ‘sort’
(1)在列表末尾添加一个新元素:append()
>>> a = [2,5,6,7,8,9,10]
>>> a
[2, 5, 6, 7, 8, 9, 10]
>>> a.append(100)
>>> a
[2, 5, 6, 7, 8, 9, 10, 100]
>>> len(a)
8
(2)清空列表所有信息:clear()
>>> a.clear()
>>> a
[]
(3)复制列表(浅拷贝):copy()
这里要分清拷贝和引用传递!
>>> a = [2,5,6,7,8,9,10]
>>> a.copy()
[2, 5, 6, 7, 8, 9, 10]
>>> aa = a.copy()
>>> aa
[2, 5, 6, 7, 8, 9, 10]
(4)统计元素在列表中的个数:count()
>>> b=[2,2,2,3,4,4,4,5,4,5,7,7,7,7,7,7]
>>> b.count(7)
6
>>> b.count(4)
4
(5)查询元素在列表中第一次出现的下标位置:index()
注意:如果列表不存在该元素,则抛出异常;
下标从0开始!
>>> b=[2,2,2,3,4,4,4,5,4,5,7,7,7,7,7,7]
>>> b.index(4)
4
>>> b.index(7)
10
>>> b.index(8)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 8 is not in list
(6)指定要插入的元素的位置:insert()
>>> b.insert(2,"2333333")
>>> b
[2, 2, '2333333', 2, 3, 4, 4, 4, 5, 4, 5, 7, 7, 7, 7, 7, 7]
insert和append的区别:append是在末尾加,insert可以确认添加位置。
>>> b.append("lzzx")
>>> b
[2, 2, '2333333', 2, 3, 4, 4, 4, 5, 4, 5, 7, 7, 7, 7, 7, 7, 'lzzx']
(7)通过下标来移除元素:pop()
没有下标会默认删除最后一个
>>> b
[2, 2, '2333333', 2, 3, 4, 4, '886886', 4, '886886', 5, 4, 5, 7, 7, 7, 7, 7, 7, 'lzzx']
>>> b.pop(3)
2
>>>
>>> b
[2, 2, '2333333', 3, 4, 4, '886886', 4, '886886', 5, 4, 5, 7, 7, 7, 7, 7, 7, 'lzzx']
(8)移除对应的元素:remove()
如果列表中不存在该元素,则抛出异常。
>>> b
[2, 2, 3, 4, 4, '886886', 4, '886886', 5, 4, 5, 7, 7, 7, 7, 7, 'lzzx']
>>> b.remove("886886")
>>> b
[2, 2, 3, 4, 4, 4, '886886', 5, 4, 5, 7, 7, 7, 7, 7, 'lzzx']
(9)翻转元素的顺序:reverse()
>>> b
[2, 2, 3, 4, 4, 4, '886886', 5, 4, 5, 7, 7, 7, 7, 7, 'lzzx']
>>> b.reverse()
>>> b
['lzzx', 7, 7, 7, 7, 7, 5, 4, 5, '886886', 4, 4, 4, 3, 2, 2]
(10)排序(主要针对数字):sort()
>>> b
[7, 7, 7, 7, 7, 5, 4, 5, 4, 4, 4, 3, 2, 2]
>>> b.sort()
>>> b
[2, 2, 3, 4, 4, 4, 4, 5, 5, 7, 7, 7, 7, 7]
(11)合并列表:extend()
>>> b
[2, 2, 3, 4, 4, 4, 4, 5, 5, 7, 7, 7, 7, 7]
>>> a
[2, 5, 6, 7, 8, 9, 10, 1000]
>>> a.extend(b)
>>> a
[2, 5, 6, 7, 8, 9, 10, 1000, 2, 2, 3, 4, 4, 4, 4, 5, 5, 7, 7, 7, 7, 7]
>>> b
[2, 2, 3, 4, 4, 4, 4, 5, 5, 7, 7, 7, 7, 7]
二.元组 Tuple
1.什么是元组?
元组在Python中,其实是列表的一种特殊形式,一旦声明创建就不允许改变。
2.语法结构
使用一对圆括号包含起来的一组数据,可以存放重复数据。
name = ('仁',"义","礼","智","信");
name
('仁', '义', '礼', '智', '信')
name[2] #可以通过索引查找对应的值
'礼'
3.如何定义元组?
在定义元组时,如果只有一个元素,那么一定要在该元素后加一个逗号,否则Python解释器将该元组当成一个数字对待。
>>> d = tuple((1,3,5,7,9))
>>> d
(1, 3, 5, 7, 9)
4.元组的常用指令
count、index
5.特点
元组中如果存放的是其他的内容可变的话,一定要注意此时的元组中对象的数据是可变的。
group = ("孙悟空","唐僧","沙僧",['猪八戒','高老庄']);
group
('孙悟空', '唐僧', '沙僧', ['猪八戒', '高老庄'])
group[3][0]="如来"#因为第四个参数是 list,可以变化,所以能修改
三.集合
1.集合的特点
①.和列表相似,但是不能存储相同数据;
②.存放没有顺序,也就是没有下标。
2.语法结构
使用一对大括号/花括号包含起来的数据。
han = {"刘备","曹操","孙权"};
han
{'曹操', '刘备', '孙权'}
3.如何定义集合?
用花括号的不一定都是set,否则定义的是dict。
>>> c = set((222,333,444,555,666))
>>> c
{555, 333, 666, 444, 222}
4.集合的常用指令
(1)添加:add()
>>> c
{555, 333, 666, 444, 222}
>>> c.add(111111)
>>> c
{111111, 555, 333, 666, 444, 222}
(2)清除:clear()
(3)拷贝:copy()
(4)求差集:difference()
>>> c
{333, 666, 444, 222}
>>> ccc = set((123,456,789,333,666))
>>> ccc
{456, 333, 789, 666, 123}
>>> c.difference(ccc)
{444, 222}
(5)求交集:intersection()
>>> c.intersection(ccc)
{666, 333}
(6)求并集:union()
>>> c.union(ccc)
{456, 333, 789, 666, 123, 444, 222}
(7)随机移除,一般不用:pop()
>>> c.pop()
111111
>>> c
{555, 333, 666, 444, 222}
>>> c.pop()
555
>>> c
{333, 666, 444, 222}
(8)移除元素:remove()
不存在的元素被输入会报错
(9)移除元素:discard()
不存在的元素被输入不会报错。
>>> c
{333, 666, 444, 222}
>>> c.discard(666)
>>> c
{333, 444, 222}
>>> c.discard(888)
>>>
>>> c
{333, 444, 222}
四.字典 Dict
提供了一种特殊的存储数据的组合数据类型,key-value:变量-值。
Python中的字典类型,key必须是字符串。
1.字典的定义
>>> c={}
>>> c
{}
>>> type(c)
<class 'dict'>
>>> c = dict({"name":"jay","age":"41"})
>>> c
{'name': 'jay', 'age': '41'}
2.字典的常用指令
(1)修改制定数据
>>> c["name"] = "mingzi"
>>> c
{'name': 'mingzi', 'age': '41'}
(2)访问元素
若元素不存在,则增加这个值。
>>> c["name"]
'mingzi'
>>> c["wife"] = "kunling"
>>> c
{'name': 'mingzi', 'age': '41', 'wife': 'kunling'}
(3)清除:clear()
(4)拷贝:copy()
(5)查找:get()
通过key或者该key对应的值,如果没有这个key,则返回None。
>>> c.get("name")
'mingzi'
>>> c.get("dad")
>>>
(6)成对返回键值对:items()
>>> c.items()
dict_items([('name', 'mingzi'), ('age', '41'), ('wife', 'kunling')])
(7)返回所有的key:keys()
>>> c.keys()
dict_keys(['name', 'age', 'wife'])
(8)返回所有的值:values()
>>> c.values()
dict_values(['mingzi', '41', 'kunling'])
(9)删除:pop()
通过key,删除对应的键值对,如果该键不存在,则抛出异常。
>>> c.pop("name")
'mingzi'
>>> c
{'age': '41', 'wife': 'kunling'}
(10)移除:popitem()
移除一个键值对,按照LIFO规则(last in first out)。
>>> c
{'age': '41', 'wife': 'kunling'}
>>> c.popitem()
('wife', 'kunling')
>>> c
{'age': '41'}
3.字典的迭代
方法一:
for k in d2:
print(k,d2[k])
>>> for k in c:
... print(k,c[k])
...
name mingzi
age 41
wife kunling
方法二:(与方法一本质一样)
for key in d2.keys():
print(k, d2[k])
方法三:
for k,v in d2.items():
print(k, v)
>>> for k,v in c.items():
... print(k,c[k])
...
name mingzi
age 41
wife kunling
以上四种数据类型的比较
元组 Tuple 是存放固定的数据
集合 Set 中的数据插入和遍历的时间,随数据增多而变慢
列表 List 中的数据插入和查询的时间,随数据的增多而变慢
字典 Dict 中的数据插入和查询的速度非常快,不会因为数据太多而变慢
元组、集合和列表占用内存较少,字典占用内存较多,字典是一种通过占用空间来换取操作速度的一种数据类型。