字典

一、字典

(1)字典在其他语言中叫键值对数据,在python中叫字典。一个字典包括2部分,键和值,字典在表示的时候dic =  {键:值},表示时,对值没有要求,对键有要求,键必须是可哈希对象(不可变数据类型),键和值必须成对出现,哪怕值是()

#####不可哈希的就是可变的数据,不可变的数据能哈希。

可变数据类型:

不可变数据类型:

(2)python3.6以上版本字典默认是有序的,但有人问起来还是要说字典是无序的(为什么说字典是有序的呢?因为python3.6以上版本字典不能合并,简言之,就是不能dic1+dic2,同样,字典也不能使用下标)

print({1:"asd"} + {2:"dass"})

报错了
TypeError                                 Traceback (most recent call last)
<ipython-input-19-8b26544e8c34> in <module>
----> 1 print({1:"asd"} + {2:"dass"})

TypeError: unsupported operand type(s) for +: 'dict' and 'dict'

 

(3)一个字典不能出现重复的键,如果键重复了,重复的话就会把值覆盖

(4)一个字典是一个存储键值对集合的容器对象,它通过使用关键字实现快速获取、删除和更新值。

(5)相较而言,字典的查找更快一点,因为它是通过某一个关键点查找。

二、字典的操作

(1)增

1.直接赋值

dic[键] = 值,话不多说,直接上代码吧

dic2 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
dic2[11] = "王健林"
print(dic2)

输出结果:
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林'}

2.dic.setdefault(键,值)

dic2 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
dic2[11] = "王健林"
print(dic2)
dic2.setdefault(17,"小凤")
print(dic2)
dic2.setdefault(11,"阿浩")
print(dic2)

输出结果:
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林'}
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林', 17: '小凤'}
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林', 17: '小凤'}

这个结果就能看到setdefault很有意思了,它有一个执行过程:

1.先去字典通过11这个键查找有没有值

2.如果有值,就不添加

3.如果没有值,就添加

再举个例子

dic2 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
dic2[11] = "王健林"
print(dic2)
dic2.setdefault(17,"小凤")
print(dic2)
dic2.setdefault(11,"阿浩")
print(dic2)
print(dic2.setdefault(18))
print(dic2)
dic2.setdefault(19,'acm')
print(dic2)

输出结果:
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林'}
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林', 17: '小凤'}
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林', 17: '小凤'}
None
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林', 17: '小凤', 18: None}
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True, 11: '王健林', 17: '小凤', 18: None, 19: 'acm'}

这个执行过程:

1.先去字典中通过键查找有没有值,没有值,就是None

2.如果有值,就不添加

3.如果是None,就添加,返回的是添加的值

 

(2)删

1.del dic   ####删除整个字典

2.del dic[键]  ####通过键删除

3.dic.pop(键)   ###pop通过指定键删除,pop也有返回值,返回的是被删除的值,与列表中的pop区分开

dic1 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
print(dic1.pop(False))
print(dic1)

输出结果
1
{'1': 'xas', (1, 2): [1, 2, 3], 4: True}

4.dic.clear() ###清空

dic1 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
dic1.clear()
print(dic1)
输出结果:
{}

需要注意,字典没有remove这个操作

5.dic.popitem()  ####3.6版本及以上默认删除最后一个,3.5以下就是随即删除了

dic1 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
dic1.popitem()
print(dic1)

输出结果:
{False: 1, '1': 'xas', (1, 2): [1, 2, 3]}

(3)改

1.dic1.update(dic2)  #更新

dic1 = {"33":"dd","44":"jj"}
dic2 = {"55":"kk","66":"aa"}
dic1.update(dic2)
print(dic1)
输出结果:
{'33': 'dd', '44': 'jj', '55': 'kk', '66': 'aa'}

dic1 = {"33":"dd","44":"jj"}
dic2 = {"33":"kk","66":"aa"}
dic1.update(dic2)
print(dic1)
输出结果:
{'33': 'kk', '44': 'jj', '66': 'aa'}

1.dic1为被更新的字典,dic2是更新的内容

2.被更新的内容如果在要更新的内容中就会被覆盖,若不在,就是2个字典的合并

 

2.改的另一种方法,字典中没有的叫增,如果有的话就叫改(这么说估计也不明白,看代码吧)

dic1 = {"33":"dd","44":"jj"}
dic1["33"] = "kk"
print(dic1)
输出结果:
{'33': 'kk', '44': 'jj'}

 

 

(4)查

通过键查找有2种方式

1.通过键查找值

dic1 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
print(dic1)
print(dic1[0])
print(dic1['1'])

输出结果:
{False: 1, '1': 'xas', (1, 2): [1, 2, 3], 4: True}
1
xas
dic1 = {"33":"dd","44":"jj"}
print(dic1[2])
报错
KeyError                                  Traceback (most recent call last)
<ipython-input-6-ad0a7a37f9f5> in <module>
      1 dic1 = {"33":"dd","44":"jj"}
      2 
----> 3 print(dic1[2])

KeyError: 2

如果键不存在就会报错

 2.dic.get(键)

dic1 = {"33":"dd","44":"jj"}
print(dic1.get(2))
print(dic1.get("33"))
输出结果:
None
dd

如果键不存在,返回None

3.dic.setdefault(键)

dic1 = {"33":"dd","44":"jj"}
print(dic1.setdefault("33"))
输出结果:
dd

 

三、字典的嵌套

 

四、补充

(1)dic.keys(),  dic.values(),   dic.items()

dic1 = {"33":"dd","44":"jj"}
print(dic1.keys())   ###高仿列表dic1.keys(['33','44']),不能使用下标
print(dic1.values())   ### 高仿列表

for i in dic1.keys():
    print(i)
for j in dic1.values():
    print(j)
for k in dic1.items():
    print(k)                  ###打印出的是元组

输出结果:
dict_keys(['33', '44'])
dict_values(['dd', 'jj'])
33
44
dd
jj
('33', 'dd')
('44', 'jj')

(2)解构

变量个数和等号右面的个数要相同,字符串,列表,元组,字典都可以解构,数字和布尔值需要用逗号间隔开

在解构时,变量个数要与等号右边字符串的长度,列表,元组,字典中的元素个数相同

a,b,c = 1,2,3
print(a)
print(b)
print(c)

d,e,f = 'asd'
print(d)
print(e)
print(f)

g,h,i = [7,8,9]
print(g)
print(h)
print(i)

输出结果:
1
2
3
a
s
d
7
8
9

再举一个解构的实例

dic2 = {False:1,'1':'xas',(1,2):[1,2,3],4:True}
for i,j in dic2.items():
    print(i)
    print(j)

输出结果
False
1
1
xas
(1, 2)
[1, 2, 3]
4
True

(3)get,pop别的用法

dic2 = {"33":"gg","44":"kk"}
ret1 = dic2.get("99","你傻呀,没有还要拿")
print(ret1)
ret2 = dic2.pop("99","傻子")
print(ret2)
ret3 = dic2.pop("99")
print(ret3)

结果:
你傻呀,没有还要拿
傻子
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-24-bab661a3efdd> in <module>
      4 ret2 = dic2.pop("99","傻子")
      5 print(ret2)
----> 6 ret3 = dic2.pop("99")
      7 print(ret3)

KeyError: '99'

(4)fromkeys

 

posted @ 2020-09-23 01:08  雨中的梦华  阅读(226)  评论(0)    收藏  举报