字典(Dictionary):
字典(Dictionary)可存储任意类型对象,如字符串、数字、元组等其他容器模型。
字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中。
如:
假设要根据同学的名字查找对应的成绩,如果用list实现,需要两个list:
names = ['A', 'B', 'C']
scores = [95, 75, 85]
给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,list越长,耗时越长。
如果用字典(Dictionary)实现,如下:
>>> d = {'A': 95, 'B': 75, 'C': 85}
>>> d['A']
95
我们可以直接根据名字查找成绩,无论这个表有多大,查找速度都不会变慢。字典(Dictionary)根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希算法(Hash)。
我们可以通过key来把数据放入字典。
一个key只能对应一个value,同一个key放入多个value值后放入的会把前面放入的value值覆盖。
如:
>>> d['D'] = 67
>>> d['D']
67
运行截图如下:
如果key不存在,字典(Dictionary)就会报错:
>>> d['E']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'E'
避免key不存在而产生错误的两种方法:
一是通过in
判断key是否存在:
>>> 'E' in d
False
二是通过字典(Dictionary)提供的get()函数,如果key不存在,可以返回None
,或者自己指定的value:
>>> d.get('E')
>>> d.get('E', -1)
-1
注意在Python的交互环境中,返回None
的时候不显示结果。
运行截图如下:
删除key采用pop(key)方法,对应的value也会被删除:
>>> d.pop('B')
75
>>> d
{'A': 95, 'B':75, 'C': 85}
注意:
dict内部存放的顺序和key放入的顺序无关。
字典(Dictionary)与列表(list)的区别:
字典(Dictionary)的特点:
查找和插入的速度极快,不会随着key的增加而变慢;需要占用大量的内存,内存浪费多。
列表(list)的特点:
查找和插入的时间随着元素的增加而增加;占用空间小,浪费内存很少。
dict是用空间来换取时间的一种方法。
正确使用字典(Dictionary)要牢记的第一条就是dict的key必须是不可变对象。
字典(Dictionary)根据key来计算value的存储位置,这个通过key计算位置的算法称为哈希算法(Hash)。要保证hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,因此,可以放心地作为key。而list是可变的,就不能作为key。
>>> key = [1, 2, 3]
>>> d[key] = 'a list'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
集合(set):
set可以看成数学意义上的无序和无重复元素的集合。set同样不可以放入可变对象。
可以使用大括号 { } 或者 set() 函数创建集合。
注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
集合(set)用来存储一组key,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
创建格式:
parame = {value01,value02,...}
或者
set(value)
我们还可以通过提供一个list作为输入集合创建一个set:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
注意:
传入的参数[1, 2, 3]
是一个list,而显示的{1, 2, 3}
只是告诉你这个set内部有1,2,3这3个元素,显示的顺序不表示set有序。
重复元素在set中会自动被过滤。
如:
>>> T = set([1, 1, 2, 2, 3, 3])
>>> T
{1, 2, 3}
运行截图如下:
我们可以通过add(key)
方法可以添加元素到set中,可以添加重复的key,但不会有效果。
如:
>>> T.add(4)
>>> T
{1, 2, 3, 4}
>>> T.add(4)
>>> T
{1, 2, 3, 4}
运行截图如下:
通过remove(key)
方法可以删除元素。
>>> s.remove(3)
>>> s
{1, 2, 2}
两个set可以做数学意义上的交集、并集等操作。
如:
>>> s & T
{1, 2}
>>> s | T
{1, 2, 3, 4}
运行截图如下:
注意:
set不可放入list对象,也不可放入含list元素的元组(tuple)对象。
可变对象与不可变对象的区别:
str是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的。
如:
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']
对于不可变对象,比如str,对str进行操作,对象的内容不变化。
举例说明:
>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc'
要理解上面的现象,我们先把代码改成下面这样:
>>> a = 'abc'
>>> b = a.replace('a', 'A')
>>> b
'Abc'
>>> a
'abc'
注意:
'abc'
才是字符串对象!我们所说的对象a
的内容是'abc'
其实是指,a
本身是一个变量,它指向的对象的内容是'abc'。
当我们调用a.replace('a', 'A')
时,实际上调用方法replace
是作用在字符串对象'abc'
上的,而这个方法虽然名字叫replace
,但却没有改变字符串'abc'
的内容。相反,replace
方法创建了一个新字符串'Abc'
并返回,如果我们用变量b
指向该新字符串,变量a
仍指向原有的字符串'abc'
,但变量b
却指向新字符串'Abc'。
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
┌───┐ ┌───────┐
│ b │─────────────────>│ 'Abc' │
└───┘ └───────┘
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。这些方法会创建新的对象并返回。