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'}

猜你喜欢

转载自www.cnblogs.com/bigbigtong/p/9941892.html