python (字典,增删改查,其他操作方法)

时间:2023-01-24 02:48:39

python (字典,增删改查,其他操作方法)

 

一、字典

字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。
存储大量的数据,是关系型数据,查询数据快。

列表是从头遍历到尾
字典使用二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。

比如字典有1~100的数据,现在想要查找75。

先劈一半,找到中间值50。判断50和75的大小,发现小于,再劈一半。

找到中间值75,直接返回结果。

 

对于字符串查找
每一个字符串,都有一个hash值,是唯一的。

1
print ( hash ( 'a' ))

执行输出:

977260134378667761

1
print ( hash ( 'afdsfeye' ))

执行输出:
-8718419340409073569

 

字典可以存放各种数据类型

1
2
3
4
5
6
7
dic  =  {
     'name' : '老男孩' ,
     'age' : 17 ,
     'name_list' :[ '张三' , '李四' ],
     1 : True
      ...
}

 

数据类型的分类:
可变数据类型(不可哈希):list,dict,set
不可变数据类型(可哈希):int,bool,str,tuple
容器类型:
容器类(承载各种数据类型):list,tuple,dic

 

字典的键:必须是不可变数据类型
字典的值:任意数据类型。

字典的键是唯一的。

数据类型分类,主要是可变和不可变

字典的顺序:
严格意义上来讲,是无序的
3.5之前,字典是无序的
3.6开始,字典创建的时候,按照一定的顺序插入的值,看起来是有序的

 

下面介绍字典的增删改查


第一种:

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
dic[ 'hobby' =  'girl'
print (dic)

执行输出:

{'age': 21, 'hobby': 'girl', 'name': 'xiao'}

 

 第二种: 

setdefault() 无则添加,有则不变

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
dic.setdefault( 'hobby' )
print (dic)

执行输出:

{'hobby': None, 'name': 'xiao', 'age': 21}

dic.setdefault('hobby') 虽然只指定了key,没有指定value,默认会填充None

添加键值对

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
dic.setdefault( 'hobby' , 'girl' )
print (dic)

执行输出:

{'age': 21, 'name': 'xiao', 'hobby': 'girl'}

添加一个已经存在的key

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
dic.setdefault( 'name' , '江疏影' )
print (dic)

执行输出:

{'name': 'xiao', 'age': 21}

 

上述2个添加的方法,只能一个个添加。

 

pop() 删除指定的key

pop()是所有方法中,唯一有返回值的。

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.pop( 'age' ))
print (dic)

执行输出:

21
{'name': 'xiao'}

 

删除一个不存在的key

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.pop( 'hobby' ))
print (dic)

执行报错: KeyError: 'hobby'

 

删除一个不存在的key,并指定默认返回值None

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.pop( 'hobby' , None ))
print (dic)

执行输出:

None
{'age': 21, 'name': 'xiao'}

推荐使用上述方法,删除一个key。因为如果key不存在时,不会报错,返回None。程序员最怕报错了!

 

clear() 清空

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
dic.clear()
print (dic)

执行输出:

{}

 

del 删除字典

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
del  dic

del也可以删除指定的key,如果不存在,会报错

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
del  dic[ 'hobby' ]

推荐使用pop删除,并指定None

 

popitem() 随机删除,有返回值

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.popitem())
print (dic)

执行输出:

('age', 21)
{'name': 'xiao'}

 

在3.6版本,会删除最后一个。
在抽签场景中,可能会用到此方法。

 

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
dic[ 'name' =  'zhangsan'
print (dic)

执行输出:

{'name': 'zhangsan', 'age': 21}

 

update() 针对2个字典的修改 

1
2
3
4
5
6
dic  =  { 'name' : 'jin' , 'age' : 21 , 'sex' : 'male' }
dic2  =  { 'name' : 'sun' , 'weight' : 76 }
#将dic键值对,覆盖并添加到dic2
dic2.update(dic)
print (dic)
print (dic2)

执行输出:

{'sex': 'male', 'name': 'jin', 'age': 21}
{'weight': 76, 'name': 'sun'}

可以发现dic没有改变,dic2改变了

update()修改原则

有相同的就覆盖,没有的就添加

 

通过key查找

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic[ 'name' ])

执行输出:

xiao

 

通过value查询

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic[ 'xiao' ])

执行报错: KeyError: 'xiao'

字典只能通过key查询,不能通过value查询,否则报错

 

get() 通过key查询

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.get( 'name' ))

执行输出:

xiao

 

查询一个不存在的key

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.get( 'hobby' ))

执行输出:

None

 

默认的None返回值是可以改变的

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.get( 'hobby' , '亲,木有这个字哦!' ))

执行输出:

亲,木有这个字哦!

 

如果需要查询多个key,请使用for循环

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
for  in  dic:
     print (i)

执行输出:

age
name

 

其它操作方法:

keys()  values()  items()

keys()

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print (dic.keys())
print ( type (dic.keys()))

执行输出:

dict_keys(['name', 'age'])
<class 'dict_keys'>

 

keys()方法输出的数据是一个特殊类型,它相当于把所有的key放到了一个容器里面。

它类似于列表的容器,当它并不是列表。

它可以循环

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
for  in  dic.keys():
     print (i)

执行输出:

age
name

 

values()

把所有的value放到一个容器里面

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
for  in  dic.values():
     print (i)

执行输出:

xiao
21

 

items()

将键值对作为一个整体,放到元组中。集中放到一个容器中。

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
for  in  dic.items():
     print (i)

执行输出:

('age', 21)
('name', 'xiao')

 

特殊类型转换为列表

1
2
dic  =  { 'name' : 'xiao' , 'age' : 21 }
print ( list (dic.keys()))

执行输出:

['age', 'name']

 

分别循环key和value

1
2
3
dic  =  { 'name' : 'xiao' , 'age' : 21 }
for  k,v  in  dic.items():
     print (k,v)

执行输出:

age 21
name xiao

 

现有如下字典,需要遍历key

1
dic  =  { 'name' : 'xiao' , 'age' : 21 }

第一种写法:

1
2
for  in  dic.keys():
     print (i)

第二种写法:

1
2
for  in  dic:
     print (i)

以上2段代码,功能是一样的。推荐使用第二种。

 

概念: 分别赋值

比如

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

执行输出:

2 3

 

面试题:

a = 4,b = 5,请用一行代码,将a和b的值互换。

答案

1
a,b  =  b,a

 

字典的嵌套

出一个题目

1
2
3
4
dic  =  {
     'name_list' :[ '张三' , 'lisi' , '隔壁王叔叔' ],
     'dic2' :{ 'name' : '太白' , 'age' : 12 }
} 

1. 给列表追加一个元素:'旺旺'
2. 给列表lisi全部大写
3. 给dic2 对应的字典添加一个键值对:hobby:girl

 

答案:

1
2
3
4
5
6
7
8
9
#1.
dic[ 'name_list' ].append( '旺旺' )
print (dic)
#2.
dic[ 'name_list' ][ 1 =  dic[ 'name_list' ][ 1 ].upper()
print (dic)
#3.
dic[ 'dic2' ][ 'hobby' =  'girl'
print (dic)

执行输出:

{'name_list': ['张三', 'lisi', '隔壁王叔叔', '旺旺'], 'dic2': {'name': '太白', 'age': 12}}
{'name_list': ['张三', 'LISI', '隔壁王叔叔', '旺旺'], 'dic2': {'name': '太白', 'age': 12}}
{'name_list': ['张三', 'LISI', '隔壁王叔叔', '旺旺'], 'dic2': {'hobby': 'girl', 'name': '太白', 'age': 12}}