Python学习第三十二天—字典(下)

[复制链接]
15271953841 发表于 2024-2-25 06:47:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
本帖最后由 15271953841 于 2024-2-25 06:53 编辑

Python 3.12.1 (tags/v3.12.1:2305ca5, Dec  7 2023, 22:03:25) [MSC v.1937 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
d=dict.fromkeys("FishC")             生成一个字典)
d
{'F': None, 'i': None, 's': None, 'h': None, 'C': None}
d["s"]=115                           (类似于序列的操作,只需要指定一个存在于字典中的键,就可以修改其对应的值)
d
{'F': None, 'i': None, 's': 115, 'h': None, 'C': None}
d.update({"i":105,"h":104})               (同时修改多个键值对)
d
{'F': None, 'i': 105, 's': 115, 'h': 104, 'C': None}
d.update(F=70,C=67)                    (也可以这样写,但注意:键不要加引号)
d
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
查找
d["C"]
67
d["c"]
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    d["c"]
KeyError: 'c'
d.get("c","这里没有小c")
'这里没有小c'
d.setdefault("C","code")        (查找一个键是否存在于字典中,如果在,返回对应的值)
67
d.setdefault("c","code")          (如果不在,则给它指定一个新的值,感觉类似于增加一个新的键值对)
'code'
d
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67, 'c': 'code'}

Items() , keys()  ,values()  三个方法分别用于获取字典的键值对,键,值的视图对象。
什么是视图对象?
视图对象即字典的动态视图,这就意味着当字典的内容发生改变的时候,视图对象的内容也会相应地跟着改变。(我个人理解就是通过上述三种方法获得键值对、键、值三者的内容叫视图对象)

keys=d.keys()
values=d.values()
items=d.items()
items
dict_items([('F', 70), ('i', 105), ('s', 115), ('h', 104), ('C', 67), ('c', 'code')])
keys
dict_keys(['F', 'i', 's', 'h', 'C', 'c'])
values
dict_values([70, 105, 115, 104, 67, 'code'])
d.pop("C")              (我个人误了键”C”)
67
d.pop("c")
'code'
d["C"]=67               (把刚刚误删的键“C“和的值,增加到字典d中)
d
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
items
dict_items([('F', 70), ('i', 105), ('s', 115), ('h', 104), ('C', 67)])
keys
dict_keys(['F', 'i', 's', 'h', 'C'])
values
dict_values([70, 105, 115, 104, 67])
浅拷贝
e=d.copy()
e
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
len(d)                  (获取键值对的数量)
5
"C" in d                   (判断某个键是否存在于字典中)
True
"c" not in d
True
list(d)                     (字典转换成列表)
['F', 'i', 's', 'h', 'C']
list(d.values())                 (获取所有的值)
[70, 105, 115, 104, 67]
e=iter(d)                   (iter()函数将字典的键构成一个迭代器)
next(e)
'F'
next(e)
'i'
next(e)
's'
next(e)
'h'
next(e)
'C'
next(e)                   (迭代器只能走一遍,走到最后就会出现异常)
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    next(e)
StopIteration

从前字典是无序的,它实现的逻辑是映射,而非排序,后来Python作者也给字典拍了一个序,在Python3.8之后的版本,可以使用reversed()对字典内部的键值对逆向操作。在之前的版本,Python因为它的字典顺序是得不到保障的,所以我们不能使用这个reversed()的方法,因为无序,就无所谓的逆向排序。有网友说3.7版本可以这样,list(reversed(list(d.values())),但我没试过。因为我没有3.7版本。
list(reversed(d.values()))
[67, 104, 115, 105, 70]

嵌套

d={"吕布":{"语文":60,"数学":70,"英语":80},"关羽":{"语文":80,"数学":90,"英语":70}}
d
{'吕布': {'语文': 60, '数学': 70, '英语': 80}, '关羽': {'语文': 80, '数学': 90, '英语': 70}}
d["吕布"]["数学"]
70
d={"吕布":[60,70,80],"关羽":[80,90,70]}
d["吕布"][1]
70

高阶的字典推导式
d={'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
b={v:k for k,v in d.items()}
b
{70: 'F', 105: 'i', 115: 's', 104: 'h', 67: 'C'}
c={v:k for k,v in d.items() if v>100}
c
{105: 'i', 115: 's', 104: 'h'}
d={xrd(x) for x in "FishC"}            (ord()是获取对应编码值)
d
{'F': 70, 'i': 105, 's': 115, 'h': 104, 'C': 67}
初学者很容易迷惑的:
d={x:y for x in [1,3,5] for y in [2,4,6]}
d
{1: 6, 3: 6, 5: 6}
因为后面for是个嵌套,相当于依次传入1:2,1:4,1:6,后面的1:6覆盖了前面的1:2,1:4,因为字典中的键不会重复的,重复了它就会用新的值去覆盖旧的值。

关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|鄂ICP备13007585号-4

在本发帖
关注公众号
QQ客服返回顶部