25 字典:当索引不好用时 1
映射 : 键(key)--> 值(value)
一、创建和访问字典
【存在问题】如果没有字典,查找对应关系就很繁琐:
>>> name = ['李旭冉', '金小川', '钏钏', '冉冉'] >>> thing = ['爱金小川', '爱李旭冉', '抱紧冉冉宝贝', '钻进钏钏怀里'] >>> print('钏钏要做的事情是:', thing[name.index('钏钏')]) 钏钏要做的事情是: 抱紧冉冉宝贝
太繁琐啦!!!要用字典!!
>>> dict1 = {'李旭冉': '爱金小川', '金小川': '爱李旭冉', '钏钏': '抱紧冉冉宝贝', '冉冉': '钻进钏钏怀里'} >>> print('钏钏要做的事情是:', dict1['钏钏']) 钏钏要做的事情是: 抱紧冉冉宝贝
(一)创建字典
>>> dict2 {1: 'one', 2: 'two', 3: 'three', 4: 'four'}
(二)访问字典
>>> dict2[2] 'two'
(三)创建空字典
>>> dict3 = {} >>> dict3 {}
(四)字典的用法 __>>> help(dict)
太多了,挑几个说:
>>> dict3 = dict((('F',70), ('i',105), ('s',115), ('h',104), ('C',67))) >>> dict3 {'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
【解释】括号很多,最外层是dict的,中间层是外层元组的(因为【dict】内只能有一个参数),最内层是内层元组的。
>>> dict4 = dict(李旭冉 = '爱金小川', 金小川 = '爱李旭冉') >>> dict4 {'李旭冉': '爱金小川', '金小川': '爱李旭冉'}
【笔记】在这里,【key】不可以加【‘’】,否则会报错
#【笔记】注意这里的形式,符号用错会报错:
dict1 = {} { '' : '' } dict2 = dict() ( : '' )
(五)更改字典
>>> dict4 {'李旭冉': '爱金小川', '金小川': '爱李旭冉'} >>> dict4['金小川'] = '最爱李旭冉了!' >>> dict4 {'李旭冉': '爱金小川', '金小川': '最爱李旭冉了!'}
(六)添加成员(与【更改字典】一致)
>>> dict4['钏钏'] = '抱紧冉冉宝贝' >>> dict4 {'李旭冉': '爱金小川', '金小川': '最爱李旭冉了!', '钏钏': '抱紧冉冉宝贝'}
26 字典:当索引不好用时 2
一、字典的内建方法
1、fromkeys(…)
dict.fromkeys(S[ ,v]) ---> New dict with keys from S and values equal to v(v default to None).
可以用fromkeys(…)方法创建并返回新的字典,第一个参数S是字典的键值,第二个参数v是可选的键值对应的值,如果第二个参数不提供的话,就是None。>>> dict1 = {} dict1.fromkeys((1, 2, 3)) {1: None, 2: None, 3: None} >>> dict1 {}
>>> dict.fromkeys((1, 2, 3), 'number') {1: 'number', 2: 'number', 3: 'number'}
【注意①】但不要尝试用【fromkeys】如下做法--分别赋值:
>>>dict.fromkeys((1, 2, 3), ('one', 'two', 'three')) {1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}
【解释】因为它做不到一一对应,只能把每个都赋上一遍。
【注意②】也不要尝试用【fromkeys】如下做法--更改字典:
>>> dict1.fromkeys((1, 3), '数字') {1: '数字', 3: '数字'}
【解释】它只会再创建一个新字典。
(二)字典的几个方法
>>> dict1 = dict.fromkeys(range(5), '赞') >>> dict1 {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞'}
1、keys() 、value() 、items()
(1)keys()
>>> for eachKey in dict1.keys(): print(eachKey) 0 1 2 3 4
(2)value()
>>> for eachValue in dict1.values(): print(eachValue) 赞 赞 赞 赞 赞
(3)items()
>>> dict1 = dict.fromkeys(range(32), '赞') >>> dict1 {0: '赞', 1: '赞', 2: '赞', 3: '赞', 4: '赞'}
【存在问题】 直接查找【dict1[]】很严格,只要没有就报错:
>>> print(dict1[4]) 赞 >>> print(dict1[5]) Traceback (most recent call last): File "<pyshell#42>", line 1, in <module> print(dict1[5]) KeyError: 5
【解决方法】报错太丑陋啦,体验感极差,那么可以用__get()方法:
2、get()方法
>>> dict1.get(4) 赞 >>> dict1.get(5) '''没有报错哦哦哦~~''' '''尝试输出一下~''' >>> print(dict1.get(6)) None
除此之外,【get()】还可以为【不存在】的项设置输出~:
PS:如果项【存在】但是不小心给他设置了输出,没关系~结果会照常输出>>> dict1.get(5, '不存在') '不存在' >>> dict1.get(4, '不存在') 赞 #结果照常输出了哦~
如果不知道一个键是否在字典中(不能查找值),可以使用成员资格操作符来进行判断。
3、成员操作符 in 和 not in
>>> 5 in dict1 False >>> 4 in dict1 True
4、清空一个字典 __clear()
>>> dict1 {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'} >>> dict1.clear() >>> dict1 {}
【注意】不用clear(),直接命名空字典在某种意义上是可以的:
>>> dict1 {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: 'five'} >>> dict1 = {} >>> dict1 {}
【存在问题】但是!!!直接命名是没有办法完全清除的!!:
>>> a = {钏钏: '爱冉冉'} >>> b = a >>> b {钏钏: '爱冉冉'} '''直接命名空列表''' >>> a = {} '''结果:''' >>> a {} >>> b {钏钏: '爱冉冉'}
【解决办法】clear就可以完全清除~
>>> a = {钏钏: '爱冉冉'} >>> b = a >>> b {钏钏: '爱冉冉'} '''用clear()方法''' >>> a.clear() '''结果:''' >>> a {} >>> b {}
【所有方法】
>>> dir(dict) ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
5、copy() __浅拷贝,区别于赋值
>>> a = {1: 'one', 2: 'two', 3: 'three'} >>> b = a.copy() >>> c = a >>> a {1: 'one', 2: 'two', 3: 'three'} >>> b {1: 'one', 2: 'two', 3: 'three'} >>> c {1: 'one', 2: 'two', 3: 'three'}
【问题】那这两种不同的方法是不是一样的呢?用【id】来查一下:
>>> id(a) 2039294984696 >>> id(b) 2039295604488 >>> id(c) 2039294984696
【解释】发现【a】和【c】的id地址相同。
【】再用【添加/更改元素】来查一下【源】:>>> c[4] = 'four' >>> c {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> b {1: 'one', 2: 'two', 3: 'three'}
6、pop() 和 popitem() __都是弹出字典中的元素,并删除
'''pop()''' >>> a = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> a.pop(2) 'two' >>> a {1: 'one', 3: 'three', 4: 'four'} '''popitem()''' >>> a = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> a.popitem() (1, 'one') >>> a {2: 'two', 3: 'three', 4: 'four'}
【解释】pop() __弹出对应键的项,返回键对应的值;
popitem() __随机从字典弹出项,返回键和值的元组。
7、setdefault(key,str) __用法与get()类似,只是如果找不到对应的键,会自动添加,值默认为None,也可以给值。在字典没有key时创建这个key并且把值赋为str
>>> a = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} >>> a.setdefault(2) # 可以寻找 'two' >>> a.setdefault(5) #不存在【5】,则 >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None} >>> a.setdefault(5, 'five') >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None} # 已添加【5: None】,不可更改 >>> a.setdefault(6, 'six') # 可以添加一个新的成员: 'six' >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None, 6: 'six'}
8、update() __用一个字典或映射关系去更新一个字典。
>>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None, 6: 'six'} >>> b = {'钏': '腊肠狗'} >>> a.update(b) # 更新 >>> a {1: 'one', 2: 'two', 3: 'three', 4: 'four', 5: None, 6: 'six', '钏': '腊肠狗'}