Python字典及其使用方法
字典的定义
Python中的字典属于散列类型,其数据内容是以键值对的形式存在。即 { k e y : v a l u e } \{key:value\} {key:value}的形式,其中,key值是不可变类型,value是可变类型。key值不能相同,但是value可以相同,若key值相同,则无法存入字典,可以通过key值修改字典value,直接通过键值添加。
方法一:直接定义法
a = {1:222}
print(a,type(a))
{1: 222} <class 'dict'>
方法二:使用dict函数
a = dict(a = 1,b = 2)
print(a,type(a))
{'a': 1, 'b': 2} <class 'dict'>
字典的方法
通过key值索引取值
a = {1:222}
print(a[1])
222
copy方法
a = {1:222}
b = a.copy()
print(a,b,id(a),id(b))
{1: 222} {1: 222} 2772375662528 2772375661016
这里复习一下深浅复制,或者叫做深浅拷贝,可以看到字典copy之后,即字典做浅复制之后,因为字典中没有子对象,所以,拷贝之后的数据与原始数据是两个不同的数据。
下面来看一下,当字典中有子对象时候的情况。
a = {1:222,2:{2:333}}
b = a.copy()
print(a[2],id(a[2]))
print(b[2],id(b[2]))
b[2][2] = 1
print(a[2],id(a[2]))
print(b[2],id(b[2]))
{2: 333} 2772376625872
{2: 333} 2772376625872
{2: 1} 2772376625872
{2: 1} 2772376625872
可以看到,字典中有子对象时候,字典做浅复制以后的数据与原字典中的数据半共享,也就是说,修改原字典或浅复制得到的字典的子对象的值,另一方的值也会随之改变。所以,要想完全复制,就要使用copy模块中的deepcopy
import copy
a = {1:222,2:{2:333}}
b = copy.deepcopy(a)
print(a[2],id(a[2]))
print(b[2],id(b[2]))
b[2][2] = 1
print(a[2],id(a[2]))
print(b[2],id(b[2]))
{2: 333} 2772374503928
{2: 333} 2772375124296
{2: 333} 2772374503928
{2: 1} 2772375124296
可以看到,使用deepcopy方法做深复制之后子对象是两个完全不同的数据,它们在内存中的位置也不一样,任意修改其中的一个,另一个不会随之改变,数据完全不共享。
尤其在清洗数据或者数据处理时,要尽量备份原始数据,必须使用deepcopy方法,防止对原始数据做不可逆修改,要保证原始数据的完整性
setdefault方法
#有责查,返回value值,无则增加 a.setdefault(key,value)若value省略,则默认value值为None
a = {1:2}
print(a.setdefault(1,2))
print(a.setdefault(2))
print(a)
print(a.setdefault(3,4))
print(a)
2
None
{1: 2, 2: None}
4
{1: 2, 2: None, 3: 4}
update方法
# a.update({key,value}) 更新key的value值
a = {1:2}
a.update({1:2222})
print(a)
{1: 2222}
但是更方便的方法是直接使用索引赋值修改
a = {1:2}
a[1] = 2222
print(a)
{1: 2222}
pop方法
#pop 删除某一个键值对 pop(key)
a = {1:111,2:222}
a.pop(1)
print(a)
{2: 222}
popitem方法
#popitem 随机删除一个键值对
a = {1:111,2:222,3:333,4:444}
print(a.popitem(),type(a.popitem()))
print(a)
(4, 444) <class 'tuple'>
{1: 111, 2: 222}
clear方法
#clear 清空字典
a = {1:111,2:222,3:333,4:444}
a.clear()
print(a)
{}
get方法
#get a.get(取出value,输入key),若不存在返回None
a = {1:111,2:222,3:333,4:444}
print(a.get(1))
print(a.get(5))
111
None
keys方法
#keys 取出所有的key值,返回dict_keys
a = {1:111,2:222,3:333,4:444}
print(a.keys(),type(a.keys()))
dict_keys([1, 2, 3, 4]) <class 'dict_keys'>
values方法
#values 返回所有的value值,返回dict_values
a = {1:111,2:222,3:333,4:444}
print(a.values(),type(a.values()))
dict_values([111, 222, 333, 444]) <class 'dict_values'>
items方法
#items 取出全部的键值对,返回dict_items
a = {1:111,2:222,3:333,4:444}
print(a.items(),type(a.items()))
print(a.items(),type(a.items()))
dict_items([(1, 111), (2, 222), (3, 333), (4, 444)]) <class 'dict_items'>