Python随笔7
字典:
字典是Python中内置的一种可变容器模型,可以把它理解为map,通过key-value的方式存储任意类型的数据数据;创建方式为dir={"key1":value1,"key2":"value2"...}key和value之间用冒号隔开,多个ke、value之间用逗号隔开
值得注意的是字典中的键是唯一的,值可以不唯一
dict()方法:
dict()可以把元组或者列表转换为字典
s1=[("Name","Tom"),("age",18)] print("#将列表转换为字典") print(dict(s1)) print("#将元组转换为字典") s2=(["Sex","male"],["Loc","BJ"]) print(dict(s2))
结果:
#将列表转换为字典 {'Name': 'Tom', 'age': 18} #将元组转换为字典 {'Sex': 'male', 'Loc': 'BJ'}
字典中的key、value的简单查询、增加、删除(使用字典名[key名])
d1={"Name":"Tom","Age":20,"Hobby":"Football"} #查找字典中已有的key print(d1["Name"]) #向字典中增加key、value d1["Loc"]="BJ" print(d1) #改变字典中的key的value d1["Loc"]="SZ" print(d1)
#获取字典中键值对的数量 print(len(d1)) #删除字典中的键值对 del d1["Loc"] print(d1)
结果:
Tom {'Name': 'Tom', 'Age': 20, 'Hobby': 'Football', 'Loc': 'BJ'} {'Name': 'Tom', 'Age': 20, 'Hobby': 'Football', 'Loc': 'SZ'}
4 {'Name': 'Tom', 'Age': 20, 'Hobby': 'Football'}
get()方法:
如果字典中没有某个key,直接使用字典名[key名]的方式查询会报错
此时可以使用get()方法查看
d1={"Name":"Tom","Age":20,"Hobby":"Football"} print(d1.get("Loc","key or value not defined")) print(d1.get("Name"))
结果:
key or value not defined Tom
clear()方法:
清除字典中所有项
x={} y=x print(x) print(y) x["Key"]="Value" print(x) print(y) x.clear() print(x) print(y)
结果:
{} {} {'Key': 'Value'} {'Key': 'Value'} {} {}
x、y指向同一块内存地址,当x或者y使用了clear()方法之后,清除了字典中所有的项,那么x、y都为空
copy()和deepcopy():
深度复制deepcopy():在内存里面是开辟一块新的内存,放置复制过来的数据,所以原来的对象和复制之后新创建的对象指向的是不同的内存空间,两个对象相互独立,不会相互影响
浅复制copy():我的理解是只要原对象和复制之后的对象数据指向同一块内存地址,就是浅复制。对于列表来讲,列表list有一个地址,列表里面的元素各自有各自的地址,当我们对列表进行增删改的时候,列表的地址不变,变化的是里面的元素的地址。
例子:
这段代码可以看出列表里面的元素无论怎么变化,列表的物理地址不变
x=[1,2,3,4] print(x) print(id(x)) x[0]=5 print(x) print(id(x)) x.append(6) print(x) print(id(x))
结果:
[1, 2, 3, 4] 11628672 [5, 2, 3, 4] 11628672 [5, 2, 3, 4, 6] 11628672
例子:
下面的例子中,原字典和复制之后的字典name开始都是指向Tom的,但是无论是x或者y的name一旦发生改变,改变的那个的name就不再指向Tom但是不影响另外一个;hobby都是指向列表,这个列表无论是
增删改都不会改变列表的物理地址,所以x、y一个改变就会影响到另外一个;字典里新增的key-value也不会影响另外一个字典,因为另一个字典并不会指向这个新增的key-value
x={"name":"Tom","hobby":["swimming","running"]} y=x.copy() print(y) y["name"]="Jerry" print(x) print(y) print("--------------------------") y["hobby"].append("drinking tea") print(x) print(y) print("--------------------------") y["hobby"].remove("running") print(x) print(y) print("--------------------------") y["loc"]="BJ" print(x) print(y)
结果:
{'name': 'Tom', 'hobby': ['swimming', 'running']} {'name': 'Tom', 'hobby': ['swimming', 'running']} {'name': 'Jerry', 'hobby': ['swimming', 'running']} -------------------------- {'name': 'Tom', 'hobby': ['swimming', 'running', 'drinking tea']} {'name': 'Jerry', 'hobby': ['swimming', 'running', 'drinking tea']} -------------------------- {'name': 'Tom', 'hobby': ['swimming', 'drinking tea']} {'name': 'Jerry', 'hobby': ['swimming', 'drinking tea']} -------------------------- {'name': 'Tom', 'hobby': ['swimming', 'drinking tea']} {'name': 'Jerry', 'hobby': ['swimming', 'drinking tea'], 'loc': 'BJ'}
理解了copy(),深度复制就比较简单了
keys():
以列表的形式返回字典中的key
x={ "Tom":{ "age":12, "loc":"beijing" }, "Jerry":{ "age":18, "loc":"shanghai" }, "Allen":{ "age":20, "loc":"shenzheng" } } print(x.keys())
结果:
dict_keys(['Tom', 'Jerry', 'Allen'])
pop():
从字典中弹出指定key的项,字典会删除这个项
x={"Name":"Tom","Age":20,"Loc":"SZ"} print(x.pop("Loc")) print(x)
结果:
SZ {'Name': 'Tom', 'Age': 20}
popitem():
随机返回并删除字典中的一对键值对,一般是末尾的一对
x={"Name":"Tom","Age":20,"Loc":"SZ","Hobby":"ball"} print(x.popitem()) print(x)
结果:
('Hobby', 'ball') {'Name': 'Tom', 'Age': 20, 'Loc': 'SZ'}
setdefaults():
def setdefault(self, k, d=None): # real signature unknown; restored from __doc__
""" D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D """
pass
如果键k在字典D中,那么返回D["k"]对应的值,如果k不是D中的键,则创建一个新的键值对k:d
例子
x={"Name":"Tom","Age":20,"Loc":"SZ","Hobby":"ball"} print(x.setdefault("Age")) x.setdefault("Class","Python") print(x)
结果:
20 {'Name': 'Tom', 'Age': 20, 'Loc': 'SZ', 'Hobby': 'ball', 'Class': 'Python'}
update():
x.update(y),将字典y添加到x中,x更新,y不变
x={"Name":"Tom","Age":20,"Loc":"SZ","Hobby":"ball"} y={"Class":"Python"} x.update(y) print(x) print(y)
结果:
{'Name': 'Tom', 'Age': 20, 'Loc': 'SZ', 'Hobby': 'ball', 'Class': 'Python'} {'Class': 'Python'}