使用 dict 和 set
dict
Python内置支持,全称 dictionary,在其它语言中也被称为 map, 使用键-值(key-value)存储,例如根据名字找到相关的成绩:
>>> d = {'Michael': 95, 'Bob': 75, 'Tracy': 85}
>>> d['Michael']
95
当然上述的也可以使用两个 list,一个存名字,一个存成绩,然后通过相同的索引去查找,但是数据量越大越慢,相当于一本词典从头翻到尾只为找一个字。而反观 dict,它是通过 key 计算出 value 的内存地址来进行查找(哈希算法),相当于通过部首或拼音找字。
特点:
1. 查找速度快,且不随数据量增多而变慢,但是占用大量的内存(使用空间换取时间)
(list就是数据越多越慢,但是占用空间小)
2. 一个 key 只能对应一个 value,key 如果不存在则会报错
3. dict 内部存放的顺序和 key 放入的顺序是没有任何关联的
4. key 值必须是不可变对象
如何判断 key 值不存在?
法一
使用 IN 判断,eg: 'Thomas' in d 看结果是否为 False
法二
使用 dict 提供的 get 方法,如果不存在可以返回 None(python 的交互命令行不会有任何显示),或者自己指定的 value。 eg:
>>> d.get('Thomas')
>>> d.get('Thomas', -1)
-1
删除 key
要删除一个 key,用 pop(key)方法,其对应的 value 也会从 dict 中删除:
>>> d.pop('Bob')
75
>>> d
{'Michael': 95, 'Tracy': 85}
set
set 和 dict 类似,也是一组 key 的集合,只是不存储 value。要创建一个 set 需要提供一个 list 作为输入集合:
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
注意
1. 传入的参数 [1,2,3] 是一个 list,显示{1,2,3}只是告诉人们 set 的内部是有 1,2,3 这三个元素,显示顺序并不能证明 set 有序;
2. set 中的 key 是不会有重复的,如果输入一个有重复元素的 list ,将会被自动去重;
3. 与 dict 一样,不可放入可变对象,如果对象可变无法保证无重复元素;
修改元素
add(key) 添加元素(可以重复添加,但没有效果):
>>> s.add(4)
>>> s
{1, 2, 3, 4}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
remove(key) 删除元素:
>>> s.remove(4)
>>> s
{1, 2, 3}
交集、并集
set 可以看成是数学意义上无序和无重复元素的集合
>>> s1 = set([1, 2, 3])
>>> s2 = set([2, 3, 4])
>>> s1 & s2
{2, 3}
>>> s1 | s2
{1, 2, 3, 4}
又议不可变对象
str 是不可变对象。list 是可变对象,例如对其操作,它内部的内容是会改变的。
>>> a = ['c', 'b', 'a']
>>> a.sort()
>>> a
['a', 'b', 'c']
如果对不可变对象也进行操作呢?使用字符串的 replace() 方法:
>>> a = 'abc'
>>> a.replace('a', 'A')
'Abc'
>>> a
'abc
虽然时出现了 Abc,但是变量 a 最后仍然是 abc。如果第二句改一下就比较清楚了 b=a.replace('a', 'A'), 变的是变量,它指向的是字符串对象 'abc',而字符串对象一直没变,使用了 replace 相当于 Python 创建的一个新的字符串变量。