1.list,dict
names=['A','B','C']
score=[90,80,60]
用list给定名字找对应成绩用时长,内存小
用dict,名字-成绩对照表,速度快,内存大,用空间换取时间
>>>d={'A':90,'B':80,'C':60}
>>>d['A']
90
2.将数据放入dict的两种方法:
- >>>d={'A':32,'B':34,'C':12} #数据初始化时指定
- >>>d['A']=32 #通过key放入,可以放入很多数据key,key放入顺序与dict存放顺序无关
>>>d['A]
32
3. 多次对一个key存入value时,取最后的值
>>>d['A']=90
>>>d['A']
90
>>>d['A']=20
>>>d['A']
20
4.如果key不存在,会报错
>>> d['Thomas']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'Thomas'
5.避免key不存在的错误,两种判断key是否存在的方法
1.通过 in 判断
>>>'A' in d
False #即不存在
2.通过dict提供的 get()
如果key不存在,返回 none ,在python交互环境中不显示结果
key不存在,返回自己指定的值
>>>d.get('D')
>>>d.get('D',-8)
-8
6.删除key 用 pop(key)
>>>d.pop('C')
60
>>>d
{'A':90,'B':80}
7.dict内部存放的顺序与key放入的顺序是没有关系的
dict的key必须是 不可变对象
这是因为dict根据key来计算value的存储位置,如果计算相同的key得出的结果不同,那dict内部将会完全混乱,该算法称为哈希算法(Hash)
为保证hash的正确性,key的对象不可变,如str字符串,d整数。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
1.set是key的集合,不存储value,在set中没有重复的key ,且key无序
list作为输入集合来创建一个set
>>>s=set([1,1,2,2,A,A,3,3])
>>>s
{1,2,3,4}
或者直接s={key1,key2,key3} #key不可变
传入的参数[1,1,2,2,A,A,3,3]是一个list,而{1,2,3,4}表示该set内有4个元素,list内重复元素会被自动过滤
2.添加元素 add(key)可以重复添加,但不会有效果
>>>s.add(5)
>>>s
{1,2,3,4,5}
>>>s.add(5)
>>>s
{1,2,3,4,5}
3.删除元素 remove(key)
>>>s.remove(5)
>>>s
{1,2,3,4}
4.set是数学意义是无重复元素的无序集合,可以作交、并集等操作
>>>s1 &s2 #交集
>>>s1| s2 #并集
5.set没有存储对应的value,同样不可以放入可变对象如list
6.议可变与不可变对象 如list、str
对list操作,内容会变化
>>>a=['c','b','a]
>>>a.sort() #排序
>>>a
['a','b','c']
对str操作,即使创造新对象,原变量指向对象不改变
>>>a='abc'
>>>b=a.replace('a','A') # 替代 将'abc'中的 ‘a’换成 ‘A’, 并将变量b指向新字符串'Abc'
>>>b
'Abc'
>>>a
'abc'
要始终牢记的是,a
是变量,而'abc'
才是字符串对象!有些时候,我们经常说,对象a
的内容是'abc'
,但其实是指,a
本身是一个变量,它指向的对象的内容才是'abc'
:
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
当我们调用a.replace('a', 'A')
时,实际上调用方法replace
是作用在字符串对象'abc'
上的,而这个方法虽然名字叫replace
,但却没有改变字符串'abc'
的内容。相反,replace
方法创建了一个新字符串'Abc'
并返回,如果我们用变量b
指向该新字符串,就容易理解了,变量a
仍指向原有的字符串'abc'
,但变量b
却指向新字符串'Abc'
了:
┌───┐ ┌───────┐
│ a │─────────────────>│ 'abc' │
└───┘ └───────┘
┌───┐ ┌───────┐
│ b │─────────────────>│ 'Abc' │
└───┘ └───────┘
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
7.小结:
使用key-value存储结构的dict非常有用,要选择不可变对象作为key,常用str字符串
tuple元组是不变对象,(1,2,3)可放入dict或set
但(1,2,[4,6])不能放入dict或set中,因为其中的[4,6]list是可变对象,会报错