05-Python中的四种数据类型
概述:本文主要分析 Python 中的四种数据类型:list、tuple、dict、set
一、list
list 是一种有序列表,我们可以随时增删 list 中的元素。
list 的元素用中括号 [] 括起来,例如:
>>> coding = ['C', 'Java', 'PHP'] >>> coding ['C', 'Java', 'PHP']
len():获取元素个数
我们可以用 len() 函数来获取 list 中的元素个数:
>>> len(coding)
3
通过索引访问元素
list 和 C 语言中的数组一样,索引都从 0 开始。我们可以通过索引来访问 list 中的元素。当索引超出范围时,Python 会报 IndexError 错误。
我们有两种方式获取最后一个元素:
-
-
len(coding) - 1
-
len(-1)
-
以此类推,list 的下标可以由 0 反推,-1、-2 以此类推。
append():追加元素
可以通过 append() 向 list 末尾追加元素:
>>> coding.append('Python') >>> coding ['C', 'Java', 'PHP', 'Python']
insert():插入元素到指定位置
可以将元素插入到 list 的指定位置,原有元素依次后移:
>>> coding.insert(1, 'C++') >>> coding ['C', 'C++', 'Java', 'PHP', 'Python']
pop():删除元素
可以用 pop() 函数删除 list 末尾的元素:
>>> coding.pop() 'Python' >>> coding ['C', 'C++', 'Java', 'PHP']
通过指定索引,可以用 pop() 删除指定位置的函数
>>> coding.pop(1) 'C++' >>> coding ['C', 'Java', 'PHP']
替换某个元素:直接赋值
可以直接给指定索引的元素赋值,来替换该元素。
list 很灵活:无类型限定
list 中的元素可以是不同数据类型,甚至可以是另一个 list。
二、tuple
tuple 也是一种有序列表,称作元组,和 list 很相近。tuple 的特殊之处在于:一旦初始化就不能修改。自然地,tuple 不会有 append()、pop()、insert() 等方法。
不变带来的好处:安全
因为不可变,所以更安全。如果可能,应尽量用 tuple 代替 list。
定义 tuple 有巨坑
因为 tuple 不可变,所以定义 tuple 时,元素就要确定下来。
定义一个空的 tuple:
t = ()
定义只有 1 个元素的 tuple(前方神坑预警,非战斗人员撤离!!!):
t = (1) # 这种方式定义的不是 tuple,而是 1 这个数 t = (1, ) # 这样定义的才是只有一个元素的 tuple
敲黑板,划重点:定义只有一个元素的 tuple 时,务必加个逗号。
tuple 之变与不变
tuple 的不变,说的是指向的地址不变。至于指向地址中的内容是否变化,tuple 表示无力管辖。
举个栗子:tuple 中有个元素是 list,tuple 所说的不变,是始终指向这个 list,不能转而指向其他 list。至于这个 list 中的元素是否变化,就不是 tuple 考虑的事情啦。
三、dict
dict 即为字典,类似其他语言中的 map。dict 使用键值对(key-value)存储,查找速度极快。请注意:dict 内部存放顺序和 key 的存入顺序无关。
例如,用 dict 实现工资表并查询:
>>> d = {'Albert': 11000, 'Chin': 5500, 'Chris': 12000} >>> d['Albert'] 10000
快是如何练成的
为什么 dict 查找速度快?因为 dict 不是按索引查找,而是使用哈希算法(Hash)根据 key 算出 value 的内存地址,直接去对应的内存取出数据。同理,在向 dict 中加入新的 key-value 对时,也要根据 key 来计算出 value 的地址。由于要根据 key 计算 value 的位置,所以 key 必须是不可变的。
如何将数据放入 dict
方法一:初始化时指定;
方法二:通过 key 放入。例如我们给 Albert 同学涨薪:
>>> d['Albert'] = 15000 >>> d['Albert'] 15000
由于key 和 value 是一一对应的,所以向某个 key 赋新值,会将原来的 value 覆盖掉。
如果 key 不存在,dict 会报错。避免这种错误的方法有两种:
- 通过 in 来判断 key 是否存在: ‘Thomas’ in d
- 通过 dict 提供的 get() 方法。如果 key 不存在,则返回 None 或自己指定的 value: d.get('Thomas') 或 d.get('Thomas', -1)
如何删除一个 key
要删除一个 key,可以用 pop(key) 方法。
list 与 dict 孰美?
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
四、set
set 也是一组 key 的集合,但不存储 value。key 不能重复,set 中没有重复的 key。
如何创建 set
要创建一个 set,需要提供一个 list 作为输入集合:
>>> s = set([1, 2, 3]) >>> s {1, 2, 3}
虽然我们传入的 list 是有序的,但 set 中只是有这些元素,并无排序。
set 会自动将重复的 key 过滤掉:
>>> s = set([1, 2, 3, 3]) >>> s {1, 2, 3}
如何将元素添加到 set 中
可以用 add(key) 方法将元素添加到 set 中。如果重复添加同一个元素,不会报错,只是没有效果。
如何删除 set 中的元素
通过 remove(key) 方法可以删除元素:
>>> s.remove(2) >>> s {1, 3}
查漏补缺
set 就像数学上的集合,也可以做交集、并集等操作:
>>> s1 = set([1, 2, 3]) >>> s2 = set([2, 3, 4]) >>> s1 & s2 {2, 3} >>> s1 | s2 {1, 2, 3, 4}
set 和 dict 的原理一样,也不能放入可变对象。如果无法判断两个可变对象是否相等,自然也不能保证 set 内部“不会有重复元素”。