zl程序教程

您现在的位置是:首页 >  后端

当前栏目

python基础教程之字典操作详解

Python 详解 Python 操作 字典 基础教程
2023-06-13 09:15:24 时间

字典
dictionary

1.键值对的集合(map)

2.字典是以大括号“{}”包围的数据集合

3.字典是无序的,在字典中通过键来访问成员。可变的,可嵌套,可以原处修改扩展等,不产生新的字典

4.字典的键,可以是字符串(大小写敏感),数字常量或元组(不可变类型),同一个字典的键可以混用类型。字典的键必须是可哈希的

元组作为键的条件是,元组内的值都是不可变类型

复制代码代码如下:

a=(1,2) #可以作为键
b=(1,2,[3,4]) #不可以

5.字典的值可以是任意类型,可以嵌套,可以自由修改

声明
创建字典的几种方式:

1.基本

复制代码代码如下:

d={}#空字典
d={"name":"tom","age":22}
#等价
d={}
d["name"]="tom"
d["age"]=22

2.dict

复制代码代码如下:
d=dict()#空
d=dict(name="tom",age=22)  

d=dict([("name","tom"),("age",22)])
#等价
keys=["name","age"]
values=["tom",22]
d=dict(zip(keys,values))

3.fromkeys

不指定default_value的话,默认None

复制代码代码如下:
>>>dict.fromkeys(["name","age"],"default_value")
{"age":"default_value","name":"default_value"}

基本操作

0.获取帮助

复制代码代码如下:
help(dict)

1.判定键是否存在于字典中
复制代码代码如下:
ifkind:  #knotin
   dosomething()

2.读取

复制代码代码如下:
d={"a":1,"b":2}
printd["a"] #得到1,但是若键不存在,将引发异常KeyError。慎用,建议不使用

printd.get("c",3)#得到3,get方法,若是键不存在,返回第二个参数default_value.若是没有设default_value返回None
处理missing-key错误三种方式,根据具体需要

复制代码代码如下:
ifkind:
   printd[k]

try:
   printd[k]
exceptKeyError:
   dosomething()

printd.get(k,default)
#等价d[k]ifkindelsedefault

3.遍历

方式1:

复制代码代码如下:
forkeyind:
   printkey,d[key]
#等价forkeyind.keys()

方式2:

复制代码代码如下:
forkey,valueind.items():
   printkey,value

4.修改方式1:某个键值对

复制代码代码如下:
d["key"]="newvalue"

方式2:批量添加或更新

复制代码代码如下:
#另一个字典
d.update({"key":"newvalue"}) #这里支持一整组值

#元组列表
d.update([("a",1),("b",2)])#每个元组两个元素,(key,value)

#**key
d.update(c=3,e=4)

5.删除

复制代码代码如下:
deld["key"]
value=d.pop("key")#删除并返回值
d.clear()#清空
6.其他:

len(d)  #长度
d.keys() #key列表
d.values() #value列表
d.items()  #(key,value)列表
c=d.copy()  #浅拷贝
#返回迭代器,节省内存
d.iterkeys()
d.itervalues()
d.iteritems()
d.setdefault("name","ken")#若原来没有,设置,否则原值不变

其他
1.字典排序按照key排序

复制代码代码如下:
keys=d.keys()
keys.sort()
forkeyinkeys:
   printd.get(key)

按照value进行排序

复制代码代码如下:
sorted(d.items(),lambdax,y:cmp(x[1],y[1]))

另外:
复制代码代码如下:
#假设d为字典
sorted(d) #返回同sorted(d.keys()),返回的是key排序

2.自定义对象作为key

必须:

复制代码代码如下:
def__hash__(self):
   pass
def__eq__(self,other):
   pass

3.字典拷贝浅拷贝:

复制代码代码如下:
c=d.copy()#

深拷贝必须用copy模块
复制代码代码如下:
formcopyimportdeepcopy
c=deepcopy(d)

4.一种使用场景假设有一个很大的列表l,假设10w条记录

有一个小列表b,要判断b中元素是否在l中

如果:

复制代码代码如下:
foriinb:
   ifiinl:
       dosomething()

你会发现非常非常慢...因为第二个in语句,会遍历10w条….

改进:

复制代码代码如下:
d=dict.fromkeys(l)
foriinb:
   ifiind:
       dosomething()
#空间换时间,O(n)->O(1)