25~26 字典

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', '钏': '腊肠狗'}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值