python-基础(5)-字典

python专栏地址
上一篇: python-基础(4)-list

字典

本节主要介绍

  • 字典初始
  • 字典的操作

一、字典简单了解

所谓字典,就像我们常用的字典一样,输入一个页码,就到达一页。它有两种方式创建:

  • 直接写name={}
  • name=dict()
gufeng = {"gufen": 1, "feng": "234"}
gufeng
{'gufen': 1, 'feng': '234'}
type(gufeng)
dict
gufeng = dict()
type(gufeng)
dict
gufeng
{}
gufeng = dict({"gu": 1, "feng": 2})
gufeng
{'gu': 1, 'feng': 2}

二、字典结构操作

  • key-value

1、初始化

  • 一个个添加
  • 一次添加一组
    字典中存放的东西的顺序是乱序的,和添加的顺组无关,打印后顺序有可能会乱
test = {}
test["first"] = 123
test
{'first': 123}
test["python"] = 456
test
{'first': 123, 'python': 456}
# 添加一组
test = {"gu": 123, "feng": 456, "python": 789}
test
{'gu': 123, 'feng': 456, 'python': 789}
test = dict([("gu", 123), ("feng", 456)])
test
{'gu': 123, 'feng': 456}

2、 取值/查找

字典中的查找是通过键值查找,不能通过序号查找
查找有两种,

  • 直接通过字典名后跟键值
  • 通过get方法
gufeng = {"gu": 123, "feng": 456, "python": 789}
gufeng["python"]
789
# 修改其中元素
gufeng["python"] = 567
gufeng
{'gu': 123, 'feng': 456, 'python': 567}

通过get方法

gufeng.get("wang")
# get方法有个好处是,对于没有的可以做出自己规定的响应
gufeng.get("fengzi", "没有")
'没有'
dishes = {"eggs": 2, "sausage": 1, "bacon": 1, "spam": 500}
keys = dishes.keys()
values = dishes.values()
print(keys)
print(values)
dict_keys(['eggs', 'sausage', 'bacon', 'spam'])
dict_values([2, 1, 1, 500])

3、 数值类型

任何数值类型都行

gufeng_value = [1, 2, 3]
gufeng_value2 = {}
gufeng_value2["gufeng"] = gufeng_value
gufeng_value2["gufeng2"] = 3
gufeng_value2
{'gufeng': [1, 2, 3], 'gufeng2': 3}

这里用到了字典的嵌套

gufeng = {}
d1 = {"gu": 123, "feng": 456}
d2 = {"gu2": 1231, "feng1": 4561}
gufeng["test1"] = d1
gufeng["test2"] = d2
gufeng
{'test1': {'gu': 123, 'feng': 456}, 'test2': {'gu2': 1231, 'feng1': 4561}}

4、键是否存在

通过in查找

d1 = {"gu2": 1231, "feng1": 4561}
"gu2" in d1
True
"hello" in d1
False
gufeng = dict([("gu", 123), ("feng", 456)])
if "gu" in gufeng.keys():print("111")
111

5、 字典方法

5.1 clear()

# clear()
d = {}
a = d
d["name"] = "gufeng"
d["age"] = 22
d
{'name': 'gufeng', 'age': 22}
d = {}  # d被清空了
d
{}
a  # a仍然存在
{'name': 'gufeng', 'age': 22}
# 使用clear()清空的方法
d = {}
a = d
d["name"] = "gufeng"
d["age"] = 22
print(d)
m = d.clear()
print(d)
print(a)
{'name': 'gufeng', 'age': 22}
{}
{}

5.2 copy()

从下面的例子可以看出,当在副本替换值时,原始字典不受影响,但是如果修改了某个值(这里修改和替换不一样),原始的字典也会改变

为了解决以上的问题,可以采用深复制的方法,deepcopy().

x = {"username": "admin", "info": ["nishishui", "gufeng", 12]}
y = x.copy()
y["username"] = "gufeng"
y["info"].remove(12)
y
{'username': 'gufeng', 'info': ['nishishui', 'gufeng']}
x
{'username': 'admin', 'info': ['nishishui', 'gufeng']}
x = {"username": "admin", "info": ["nishishui", "wngkai"]}
y = x.copy()
y["info"] = ["ni"]
y
{'username': 'admin', 'info': ['ni']}
x
{'username': 'admin', 'info': ['nishishui', 'wngkai']}

5.3 deepcopy()

from copy import deepcopyx = {"username": "admin", "info": ["nishishui", "gufeng", 12]}
y = deepcopy(x)
y["username"] = "gufeng"
y["info"].remove(12)
# 与自己发生变化
y
{'username': 'gufeng', 'info': ['nishishui', 'gufeng']}
x  # 不会影响x
{'username': 'admin', 'info': ['nishishui', 'gufeng', 12]}

5.4 fromkeys()

set.fromkeys() 是 Python 中 set 类型的一个类方法,用于创建一个新的集合,该集合包含由指定的可迭代对象提供的元素作为键,并将每个键的值都设置为指定的值。但需要注意的是,由于集合中的元素是唯一的,所以 fromkeys() 方法中的值参数实际上在结果集合中并不会被体现出来,因为集合只关心键(元素)的存在与否,不关心其值。

# 创建一个新的集合,其中元素为 'a', 'b', 'c',每个元素的值都被设置为一个固定的值(虽然这个值在集合中不体现)  
s = {}.fromkeys(['a', 'b', 'c'], 'some_value')  
print(s)  # 输出:{'a', 'b', 'c'}  # 实际上,你可以不提供值参数,因为集合不关心值  
s = {}.fromkeys(['a', 'b', 'c'])  
print(s)  # 输出:{'a', 'b', 'c'}  # 注意:如果可迭代对象中有重复的元素,它们只会在结果集合中出现一次,因为集合中的元素是唯一的  
s = {}.fromkeys(['a', 'a', 'b', 'c'])  
print(s)  # 输出:{'a', 'b', 'c'}
{'a': 'some_value', 'b': 'some_value', 'c': 'some_value'}
{'a': None, 'b': None, 'c': None}
{'a': None, 'b': None, 'c': None}

5.5 keys() 和iterkeys()

  • keys():方法返回一个包含字典所有键的视图对象。这个视图对象是一个动态集合,它会随着字典的改变而改变。你可以遍历这个视图对象来获取所有的键,也可以将其转换为列表或其他数据结构。
    在Python 3中,keys() 返回的是一个视图对象,而不是一个列表。这意味着它支持集合操作,如交集、并集等,而且它的内存占用更小,因为它不需要创建一个新的列表来存储所有的键。
  • iterkeys():在Python2中,iterkeys() 方法返回一个迭代器,用于遍历字典的键。迭代器是一个可以记住遍历的位置的对象,它可以从头到尾访问数据集合的元素。与 keys() 返回的列表相比,迭代器更节省内存,因为它不需要一次性加载所有的键到内存中。然而,在Python 3中,iterkeys() 方法已经被移除,取而代之的是 keys() 方法的迭代器行为。也就是说,在Python 3中,keys() 方法返回的就是一个迭代器,你可以直接用它来遍历字典的键,而不需要调用 iterkeys()。这里不在说明iterkeys的用法
# 创建一个字典  
d = {'a': 1, 'b': 2, 'c': 3}  # 使用 keys() 方法获取所有的键,并遍历它们  
for key in d.keys():  print(key)  # 输出: a, b, c  # 将 keys() 的结果转换为列表  
key_list = list(d.keys())  
print(key_list)  # 输出: ['a', 'b', 'c']  # 使用 keys() 的结果进行集合操作  
keys1 = {'a', 'b', 'c'}  
keys2 = {'b', 'c', 'd'}  
common_keys = keys1.intersection(d.keys())  
print(common_keys)  # 输出: {'b', 'c'}
a
b
c
['a', 'b', 'c']
{'a', 'b', 'c'}

5.7 get() 获取某个key的值

d1 = {"gu2": 1231, "feng1": 4561}
print(d1.get("gu2"))
print(d1.get("gu3", "3232"))
1231
3232

5.8 pop() 弹出元素

gufeng = dict([("gu", 123), ("feng", 456)])
gufeng.pop("gu")
gufeng
{'feng': 456}
gufeng = dict([("gu", 123), ("feng", 456)])
# 上面的操作类似于del 操作
del gufeng["feng"]
gufeng
{'gu': 123}

5.9 获取所有的value

d1 = {"gu2": 1231, "feng1": 4561}
d1.values()
dict_values([1231, 4561])
if 1231 in d1.values():print("gu2")
gu2

5.10 items() 枚举所有值

d1 = {"gu2": 1231, "feng1": 4561}
d1.items()
dict_items([('gu2', 1231), ('feng1', 4561)])

5.11 update() 更新数据

用于将一个新字典的键值对添加到当前字典中,如果键已经存在,则更新其对应的值。

# 创建一个字典  
d = {'a': 1, 'b': 2}  # 创建一个新的字典,包含要更新的键值对  
new_dict = {'b': 3, 'c': 4}  # 使用 update() 方法更新字典 d  
d.update(new_dict)  # 打印更新后的字典  
print(d)  # 输出: {'a': 1, 'b': 3, 'c': 4}
{'a': 1, 'b': 3, 'c': 4}

python 字典的update方法和直接赋值有什么区别

在Python中,字典(dictionary)的update()方法和直接赋值(assignment)都可以用来修改字典的内容,但它们在使用方式和效果上存在一些区别。

  • 直接赋值

当你使用直接赋值来修改字典时,你实际上是在替换与特定键相关联的值。如果键已经存在于字典中,它的值会被新值替换;如果键不存在,一个新的键值对会被添加到字典中。

# 创建一个字典
d = {'a': 1, 'b': 2}# 直接赋值修改一个已存在的键
d['a'] = 3# 直接赋值添加一个新的键
d['c'] = 4# 打印修改后的字典
print(d)  # 输出: {'a': 3, 'b': 2, 'c': 4}
  • update() 方法

update()方法用于将一个字典的键值对合并到另一个字典中。如果传入的字典中的键在原始字典中已经存在,则这些键对应的值会被更新;如果键不存在,则这些键值对会被添加到原始字典中。

# 创建一个字典
d = {'a': 1, 'b': 2}# 使用 update() 方法更新字典
d.update({'a': 3, 'c': 4})# 打印修改后的字典
print(d)  # 输出: {'a': 3, 'b': 2, 'c': 4}
  • 区别
  1. 操作对象:直接赋值是针对单个键进行的操作,而update()方法是对整个字典进行操作的。

  2. 灵活性update()方法可以接受另一个字典或可迭代的键值对作为参数,从而允许你一次性添加或更新多个键值对。直接赋值则一次只能操作一个键值对。

  3. 返回值:直接赋值会返回新赋的值,而update()方法没有返回值(返回None),因为它直接修改了原字典。

  4. 使用场景:如果你只需要修改或添加一个键值对,直接赋值通常更直接和简单。但是,如果你需要合并两个字典或添加多个键值对,使用update()方法会更加方便。

  5. 性能:对于大量键值对的更新,update()方法可能比多次直接赋值更高效,因为它减少了函数调用和可能的内存分配次数。然而,对于单个键值对的更新,两者在性能上的差异通常可以忽略不计。

python专栏地址
上一篇: python-基础(4)-list
点个关注呗 🤪😝

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/1887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度

本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。 原文链接:OpenCV如何读取仪表中的指针刻度 最近遇到一个问题,如何读取仪表中的指针指向的刻度。 解决方法有多种,比如&#xff…

JAVA 基础知识总结

进制转换 十进制转十六进制:Integer.toHexString(int i) 十进制转八进制:Integer.toOctalString(int i) 十进制转二进制:Integer.toBinaryString(int i) 十六进制转十进制:Integer.valueOf("FFFF",16).toString() 八进…

Linux使用Docker部署DashDot访问本地服务器面板

文章目录 1. 本地环境检查1.1 安装docker1.2 下载Dashdot镜像 2. 部署DashDot应用 本篇文章我们将使用Docker在本地部署DashDot服务器仪表盘,并且结合cpolar内网穿透工具可以实现公网实时监测服务器系统、处理器、内存、存储、网络、显卡等,并且拥有API接…

【C++】双指针算法:复写零

1.题目 别看这是一道简单题,它的通过率低于一些中等甚至困难的题目! 大大增加这道题目难度的是最后一句话:1.不可越界写入。2.就地修改。 如果可以再创建一个数组的话,那么这道题目就会非常简单,但这道题目必须要求在…

Linux的学习之路:18、进程间通信(2)

摘要 本章主要是说一下命名管道和共享内存 目录 摘要 一、命名管道 1、创建一个命名管道 2、匿名管道与命名管道的区别 3、命名管道的打开规则 4、代码实现 二、system V共享内存 1、共享内存 2、共享内存函数 三、代码 四、思维导图 一、命名管道 1、创建一个命…

13.Nacos简介,下载,安装,启动-windows

Nacos是阿里巴巴的产品,现在是SpringCloud的一个组件。 相比Eureka功能更加丰富,服务注册与发现和分布式配置。 Nacos下载地址: https://github.com/alibaba/nacos windows下载nacos-server-1.4.1.zip文件 nacos是基于java语言实现的&…

【系统架构师】-案例考点(三)

1、信息系统架构ISA设计 四种架构模型: 1)单机应用 2)客户机/服务器模式:两层、三层C/S、B/S模型、MVC模式等 3)面向服务架构SOA 4)企业数据交换总线:不同企业应用之间通过信息交换的公共频…

2024-04-21 问AI: 介绍一下花卉数据集Oxford 102 flowers

文心一言 Oxford 102 flowers数据集是一个由牛津大学工程科学系于2008年发布的花卉图像分类数据集。该数据集主要用于图像分类任务,并涵盖了英国常见的102种花卉,每种花卉由40到258张图像组成。这些图像涵盖了较大的比例、姿势和光线变化,使…

opengauss pending启动转主备代码分析

opengauss以pending启动时,也会执行StartupXLOG,并且replay wal,ApplyRedoRecord()会被调用。 当对pending状态的gaussdb,执行gs_ctl notify -M primary 时,会启动walsender等线程。 gs_ctl与gaussdb之间的交互不是通…

一招下载transformers真不用网上那些教程(我试了1*mol多次才知道)

pip很多是2 然而!!!!!!!!!!!!!!!!!!!!…

element中file-upload组件的提示‘按delete键可删除’,怎么去掉

问题描述 element中file-upload组件会出现这种提示‘按delete键可删除’ 解决方案: 这是因为使用file-upload组件时自带的提示会盖住上传的文件名,修改一下自带的样式即可 ::v-deep .el-upload-list__item.is-success.focusing .el-icon-close-tip {d…

洛谷 -P1007 独木桥(模拟,思维)

独木桥 题目背景 战争已经进入到紧要时间。你是运输小队长,正在率领运输部队向前线运送物资。运输任务像做题一样的无聊。你希望找些刺激,于是命令你的士兵们到前方的一座独木桥上欣赏风景,而你留在桥下欣赏士兵们。士兵们十分愤怒&#xf…

angular17 打包项目放在了多出了个browser目录

修改package.json配置文件,把 "builder": "angular-devkit/build-angular:application", 改成"builder": "angular-devkit/build-angular:browser", 把"browser": "src/main.ts",改成"main&qu…

排队分红,你想象不到的电商新玩法

亲爱的朋友们,我是微三云的周丽,一名专注于私域电商模式创新的探索者。 随着互联网的迅猛发展,电商行业的商业模式也在不断演变。最近,一种全新的消费返利模式——排队分红模式,成为了业界瞩目的焦点。这一模式结合了…

组合模式【结构型模式C++】

1.概述 组合模式又叫部分整体模式属于结构型模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。 2.结构 组件(Component):定义了组合中所有对象的通用接口&#xff0c…

three.js(3):添加three. js坐标轴、光源和阴影效果

1 实现步骤 要实现阴影效果同样需要几个重要的概念。 我们首先研究一下日常生活中是如何产生阴影效果的。 需要有光。需要一个物体,比如苹果、狗等。需要一个接受投影的元素,比如地面、桌面等。 在 Three.js 中要产生阴影效果其实和现实世界的原理差…

python:使用scipy及numpy对三维空间点进行插值并可视化

用scipy及numpy对三维空间点进行插值并可视化 示例 1示例 2示例 3 示例 1 要在Python中对三维坐标空间点进行插值,可以使用SciPy库中的插值函数。首先,需要安装SciPy库。可以使用以下命令来安装: pip install scipy接下来,可以使…

mysql 5.7分组报错问题 Expression #1 of ORDER BY clause is not in GROUP BY clause

解决方案: select version(), sql_mode;SET sql_mode(SELECT REPLACE(sql_mode,ONLY_FULL_GROUP_BY,)); 完美的解决方案是: 1 show variables like "sql_mode"; 2 3 set sql_mode; 4 set sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABL…

在Debian上可以部署哪些有用的服务?

2024年4月20日,周六下午 在 Debian 上可以部署许多有用的服务,以满足各种需求。 以下是一些常见的有用服务: Web 服务器:如 Apache、Nginx、Lighttpd 等,用于托管网站和 Web 应用。数据库服务器:如 MySQL…

java面向对象.day26(抽象类)

说明: Java抽象类是一种特殊的类,它不能被直接实例化,只能作为其他类的基类(即超类或父类)。抽象类的主要作用是定义一组公共的行为和属性,这些行为和属性可以由其子类共享和继承。 1. 定义抽象类 抽象类…