云计算百科
云计算领域专业知识百科平台

python的字典知识点

今天我们学习python中的字典,这里的字典跟我们传统意义上的字典其实是一个意思。传统意义的字典有一个查询界面,这对应的就是py字典中的健(key);每个查询对象有对应的页码解析,这个对应的解析就是py字典中的值(value)。

那么,什么是健什么是值?字典又有什么作用?接下来我们开始学习→

一、定义

字典和集合一样,都是无序可变序列。字典中的元素,两两配对,以键值对形式存储。

"""基本语法"""
{健(key):值(value),健(key):值(value),健(key):值(value),……}

字典中的健必须是不可变类型,比如字符串、数字、元组等,且字典中的健必须具备唯一性,一个字典中不能有两个重复的健存在,重复定义会将旧值覆盖。

字典中的值没有固定限制,可以是任何一种序列类型。

字典有许多生成和创建方式⬇️

序号 方式 作用 示例
x={键值对} 简单粗暴,直接字面量创建

x={"a":1,"b":2,"c":3}

dict() 使用dict()函数,给健直接赋值

x=dict(a=1,b=2,c=3)

dict(可迭代对象) 利用列表嵌套元组的方法,生成可迭代对象

# 外层:列表(可迭代)
# 内层每一项:二元元组 (键,值)
x = [("a",1), ("b",2)("c",3)]
y = dict(x)

dict.fromkeys() 快速初始化相同的值

x=dict.fromkeys(["a","b","c"],0)
#{"a":0,"b":0,"c":0}

x={} 空字典的生成

x={} #生成的x就是空字典

二、字典的增删改查

1.增/改(增加/修改元素)

若key存在,则修改value值,若key不存在,则新增一个键值对。

序号 作用 示例
修改元素

x={"a":1,"b":2,"c":3}
x["a"]=100
print(x)
#{"a":100,"b":2,"c":3}

新增元素

x={"a":1,"b":2,"c":3,}
x["D"]=4
print(x)
#{"a":1,"b":2,"c":3,"D":4}

2.删(删除元素)

序号 方法 作用 示例
del x[key] 利用del方法,删除固定键值对

x={"a":1,"b":2,"c":3}
del x["a"]
print(x)
#{"b":2,"c":3}

x.pop(key,默认值) 若不设置默认值,删除后返回value,没有对应的key则报错;若设置默认值,没有对应的key不报错,返回默认值。

x={"a":1,"b":2,"c":3}
y=x.pop("a")
print(y)
#1

x={"a":1,"b":2,"c":3}
y=x.pop("d",0)
print(y)
#0

x.popitem() 删除最后插入的键值对,返回元组(key,value)

x={"a":1,"b":2,"c":3}
y=x.popitem()
print(y)
#('c',3)

x.clear() 清空字典中所有的元素,保留字典对象

x={"a":1,"b":2,"c":3}
x.clear()
print(x)
#{}

3.查(查找/获取元素)

序号 方法 作用 示例
x[key] 利用key索引获取相应的值,若key不存在则报错

x={"a":1,"b":2,"c":3}
print(x["a"])
#1

print(x["d"])
#报错

x.get(key,默认值) 没有输入默认值时,若key不存在,则报错

x={"a":1,"b":2,"c":3}
y=x.get("a")
print(y)
#1

y=x.get("d")
print(y)
#报错

输入默认值时,若key不存在,则输出默认值

x={"a":1,"b":2,"c":3}
y=x.get("d",0)
print(y)
#0

三、字典的遍历及其方法

若你学习了前面的集合知识,你应该很容易理解遍历是什么,其实遍历就是获取所有元素。但对于字典来说,遍历并不一定代表获取全部的元素,也可以是获取全部的key,或则获取全部的value,还可以是获取全部的键值对等等

下面是字典获取的三大方法⬇️

序号 方法 作用 示例
x.keys() 获取字典中所有的key

x={"a":1,"b":2,"c":3}
print(x.keys())
#dict_keys(['a', 'b', 'c'])

x.values() 获取字典中所有的value

x={"a":1,"b":2,"c":3}
print(x.values())
#dict_values([1, 2, 3])

x.items() 获取字典中所有的键值对元组(key,value)

x={"a":1,"b":2,"c":3}
print(x.items())
#dict_items([('a', 1), ('b', 2), ('c', 3)])

这些方法可以获取相关元素,并存储起来。但如果需要字典遍历(一个一个的获取元素),我们可以通过以上方法与for循环结合获取。

序号 作用 示例
利用for循环,遍历key

x={"a":1,"b":2,"c":3}
for i in x.keys():
print(i,x[i])
#a 1
#b 2
#c 3

利用for循环,遍历key和value

x={"a":1,"b":2,"c":3}
for a,b in x.items():
print(f"{a}={b}")
#a=1
#b=2
#c=3

利用for循环,直接遍历字典,系统默认遍历key

x={"a":1,"b":2,"c":3}
for i in x:
print(i)
#a
#b
#c

四、字典常用内置函数

以下内置方法主要是合并字典

序号 方法 作用 示例
x.updat(y) 合并两个字典,并汇总给x

x={"a":1,"b":2}
y={"c":3,"d":4}
x.update(y)
print(x)
#{'a': 1, 'b': 2, 'c': 3, 'd': 4}

z=x|y 合并两个字典,生成一个新字典,不改变原字典

x={"a":1,"b":2}
y={"c":3,"d":4}
z=x|y
print(z)
#{'a': 1, 'b': 2, 'c': 3, 'd': 4}

x|=y 原地合并两个字典

x={"a":1,"b":2}
y={"c":3,"d":4}
x|=y
print(x)
#{'a': 1, 'b': 2, 'c': 3, 'd': 4}

五、判断健是否存在

在字典中我们可以利用in/not in的方法,判断key是否存在该字典中。

x={"a":1,"b":2,"c":3}
print("a" in x)
#True

print("d" in x)
#False

但要注意的是,in/not in的方法并不能判断字典中的值(value)

x={"a":1,"b":2,"c":3}
print(1 in x)
#False,不论值是否存在于字典中,都会输出False

当我们要用in/not in方法判断值,应该这样写

x={"a":1,"b":2,"c":3}
print(1 in x.values())
#True

六、字典推导式

之前我们学习的列表推导式和集合推导式,现在的字典推导式也和那两个差不多,只不过表达式现在需要两个,一个key表达式,一个value表达式。

1.基本推导式

{key表达式: value表达式 for 变量 in 可迭代对象}

前面部分由两个表达式生成结果,后面的循环依次输出范围内数据,举个例子

x={i:i*2 for i in range(5)}
print(x)
#{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}

2.带分支结构推导式

{key表达式: value表达式 for 变量 in 可迭代对象 if 条件}

利用if语句,筛选不需要的部分

x={i:i*2 for i in range(10) if i>5}
print(x)
#{6: 12, 7: 14, 8: 16, 9: 18}

跟其他序列类型相同的,字典推导式主要作用也是更快的生成字典,而不是使用传统的for循环生成。字典推导式当然也可以用嵌套的形式来写,并且有多个分支结构搭配,读者们可以根据自己的需求自由搭配。

但是需要注意的是,推导式是一种简洁的操作形式,不要为了更高级的形式就刻意地使用它,因为py讲究的是通俗易懂的形式~

七、字典的拷贝问题

拷贝与赋值不同的是,拷贝是生成两个不同地址的字典,而赋值是生成两个地址相同的字典。

若地址相同,则只要有一个字典改变,另一个就会跟着改变。同理,地址不同的字典不会受另一个的改变而改变。

1.浅拷贝

拷贝字典浅层内容,浅层地址发生改变,深层地址不变。

x = {"a": [1,2]}
y = x.copy()
x["a"].append(3)
print(y)
#{"a":[1,2,3]}

以上例子体现我们给x浅拷贝,生成y字典,并将x深层内容改变,y也会随之改变,这就体现x和y实际上深层地址是同一个。

2.深拷贝

利用copy模块的deepcopy方法,可以给字典进行深拷贝,这样字典的浅层和嵌套层地址都会发生改变。

import copy
x={"a":[1,2],"b":[3,4]}
y=copy.deepcopy(x)
x["a"].append(5)
print(x)
print(y)
#{'a': [1, 2, 5], 'b': [3, 4]}
#{'a': [1, 2], 'b': [3, 4]}

显然,这样x和y就不会相等。

八、总结

利用字典收集大量内容,可以让我们快速获取所需的值,不用一个一个去查找。

下面是我通过morse密码,获取对应的字母,输出“加密“语句对应的英文。

morse = {
'a': '.-', 'b': '-…', 'c': '-.-.', 'd': '-..', 'e': '.',
'f': '..-.', 'g': '–.', 'h': '….', 'i': '..', 'j': '.—',
'k': '-.-', 'l': '.-..', 'm': '–', 'n': '-.', 'o': '—',
'p': '.–.', 'q': '–.-', 'r': '.-.', 's': '…', 't': '-',
'u': '..-', 'v': '…-', 'w': '.–', 'x': '-..-', 'y': '-.–', 'z': '–..'
}
reverse_morse = {v: k for k, v in morse.items()}
morse_str = "…. . .-.. .-.. —"
code_list = morse_str.split()
res = ""
for code in code_list:
res += reverse_morse[code]
print(res)

#hello

怎么样,是不是比肉眼一个个对应方便很多呢?

多多动动你的小手操作一下,也许你也能够轻松地写一个强大的字典~

最后,感谢大家的阅读,如果你对py的其他知识感兴趣,可以看看我的其他博客,那里有清晰的讲解。如果本篇文章有什么不足和漏洞,希望大家可以指出,我将立即做出改正!!

赞(0)
未经允许不得转载:网硕互联帮助中心 » python的字典知识点
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!