python数据类型之字典、元组

一、字典

1、定义字典

字典是 有序(3.6+以前无序)键不重复 且 元素只能是键值对可变的 个 容器。键不重复,重复则会被覆盖

如下定义一个字典

# 使用大括号 {} 来创建空字典
test_dic1 = {}
# 使用内建函数 dict() 创建字典:
test_dic2 = dict()
# 创建有值得字典
info = {"age": 12,"status": True,"name": "测试","hobby": ['篮球', '足球'],(11, 22, 33): ["alex", "eric"],True: 5,12: 10
}# 打印字典
print(info)  # {'age': 12, 'status': True, 'name': '测试', 'hobby': ['篮球', '足球'], (11, 22, 33): ['alex', 'eric'], True: 5, 12: 10}
# 查看字典大小
print(len(info))  # 7
# 字典类型
print(type(info))  # <class 'dict'>

字典中对键值得要求:

  • 键:必须可哈希。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。(集合)
  • 值:任意类型。

如下的字典是不合法的

# 不合法
v1 = {[1, 2, 3]: '周杰伦',"age" : 18
} 
v2 = {{1,2,3}: "哈哈哈",'name':"alex"
} v3 = {{"k1":123,"k2":456}: '呵呵呵',"age":999
}

 注意:字典里 如何一个key是1或0,另一个是True或False,会替换掉,如下 


test = {1: 5, True: 6}
print(test)  # 打印结果是{1: 6}

一般在什么情况下会用到字典呢?

当我们想要表示一组固定信息时,用字典可以更加的直观,例如:

# 用户列表
user_list = [ ("alex","123"), ("admin","666") ]
# 用户列表 字典表示
user_list = [ {"name":"alex","pwd":"123"}, {"name":"eric","pwd":"123"} ]

2、获取字典值

info = {"age": 12,"status": 0,"name": "测试","data": None
}# 获取值
name = info.get("name")
email = info.get("email")  # 如果键不存在返回 None
data = info.get("data")  # 注意:如果值是None 返回结果就是值Noneif name:print("键name存在,值是", name)  # 打印
if email:print("键email存在,值是", email)  # 不打印
if data:print("键data存在,值是", data)  # 不打印

3、所有键

info = {"age": 12,"status": 0,"name": "测试","data": None
}# 所有键
keys = info.keys()
print(keys)'''
python3输出 dict_keys(['age', 'status', 'name', 'data'])
但是python2输出['age', 'status', 'name', 'data']
Python3中返回的是高仿列表,这个高仿的列表可以被循环显示
'''
# 循环
for ele in info.keys():print(ele)
# 当然也可以通过list将高仿的列表转成列表
result = list(keys)
print(result)  # ['age', 'status', 'name', 'data']# 获取所有键 也可以直接用for循环
for item in info:print(item)

4、是否存在键

info = {"age": 12,"status": 0,"name": "测试","data": None
}# 是否存在键
# 方式1(推荐)
if "name" in info:print("info存在键name")
# 方式2
if "name" in info.keys():print("info存在键name")

5、所有值

info = {"age": 12,"status": 0,"name": "测试","data": None
}# 所有值
values = info.values()
print(values)
'''
python3输出 dict_values([12, 0, '测试', None])
python2输出 [12, 0, '测试', None]
python3输出高仿列表这个高仿的列表可以被循环显示
'''
# 循环
for v in values:print(v)# 当然通过list可以将高仿列表转成列表
value1 = list(values)
print(value1)

6、是否存在值

info = {"age": 12,"status": 0,"name": "测试","data": None
}# 是否存在值
if "测试" in info.values():print("info 存在值 测试")

7、所有键值对

info = {"age": 12,"status": 0,"name": "测试","data": None
}# 所有的键值
item1 = info.items()
print(item1)  # dict_items([('age', 12), ('status', 0), ('name', '测试'), ('data', None)])for item in info.items():print(item[0], item[1])  # item是一个元组 (键,值)for key, value in info.items():print(key, value)  # key代表键,value代表值,将键和值从元组中直接拆分出来了。

8、是否存在键值对

info = {"age": 12,"status": 0,"name": "测试","data": None
}
# 是否存在键值
if ('age', 12) in info.items():print("在")
else:print("不在")

9、设置值

info = {"age": 12,"status": 0,"name": "测试","data": None
}
# 设置值
info.setdefault("email", "test@163.com")
print(info)  # {'age': 12, 'status': 0, 'name': '测试', 'data': None, 'email': 'test@163.com'}info.setdefault("name", "test")  # 如果键存在 则不设置
print(info)  # {'age': 12, 'status': 0, 'name': '测试', 'data': None, 'email': 'test@163.com'}

10、更新键值对

info = {"age": 12,"status": 0,"name": "测试","data": None
}
# 更新值
info.update({"age": 14, "name": "test"})  # info中没有的键直接添加;有的键则更新值
print(info)  # {'age': 14, 'status': 0, 'name': 'test', 'data': None}

11、移除指定键值对

info = {"age": 12,"status": 0,"name": "测试","data": None
}
# 移除指定键值对
info.pop("age")
print(info)  # {'status': 0, 'name': '测试', 'data': None}

12、按照顺序移除(后进先出)

info = {"age": 12,"status": 0,"name": "测试","data": None
}
# 按顺序移除
data = info.popitem()
print(info)  # {'age': 12, 'status': 0, 'name': '测试'}
print(data)  # ('data', None) 被移除的被自动转成了一个元祖
  • py3.6后,popitem移除最后的值。
  • py3.6之前,popitem随机删除。

13、求并集

(Python3.9新加入)

v1 = {"k1": 1, "k2": 2}
v2 = {"k2": 22, "k3": 33}v3 = v1 | v2
print(v3) # {'k1': 1, 'k2': 22, 'k3': 33}

14、索引(键)

字典不同于元组和列表,字典的索引是,而列表和元组则是 0、1、2等数值 。 

info = {"age": 12,"status": 0,"name": "测试","data": None
}print(info["age"])  # 输出:12
print(info["xxxx"])  # 报错,通过键为索引去获取之后时,键不存在会报错(以后项目开发时建议使用get方法根据键去获取值)value = info.get("xxxxx")  # None
print(value)

15、根据索引键 修改值 和 添加值 和 删除键值对

上述示例通过键可以找到字典中的值,通过键也可以对字典进行添加和更新操作 

info = {"age": 12,"status": 0,"name": "测试","data": None
}# 增加键值对
info["gender"] = "男"
print(info)  # {'age': 12, 'status': 0, 'name': '测试', 'data': None, 'gender': '男'}# 更新键值对
info["age"] = 18
print(info)  # {'age': 18, 'status': 0, 'name': '测试', 'data': None, 'gender': '男'}# 删除键值对
del info["age"]  # 删除info字典中键为age的那个键值对(键不存在则报错)
print(info)  # 输出: {'status': 0, 'name': '测试', 'data': None, 'gender': '男'}

16、转换

v = dict([("k1", "v1"), ["k2", "v2"]])print(v)  # { "k1":"v1", "k2":"v2" }
info = {"age": 12, "status": True, "name": "test"}
v1 = list(info)  # ["age","status","name"]
v2 = list(info.keys())  # ["age","status","name"]
v3 = list(info.values())  # [12,True,"test"]
v4 = list(info.items())  # [ ("age",12), ("status",True), ("name","test") ]

17、嵌套

# 字典的键必须可哈希(list/set/dict不可哈希)
info = {(11, 22): 123
}# 错误
info = {(11, [11, 22, ], 22): "alex"
}# 字典的值可以是任意类型
info = {"k1": {12, 3, 5},"k2": {"xx": "x1"}
}# 字典的键和集合的元素在遇到 布尔值 和 1、0 时,需注意重复的情况。如下实际为1:3
info = {1: 0,True: 3
}
# 元组的元素不可以被替换
dic = {'name': 'test','age': 48,'wife': [{'name': 'aaa', 'age': 38}, {'name': 'bbb', 'age': 48}],'children': ['第一个娃', '第二个娃']
}
"""
1. 获取test的妻子名字d1 = dic['wife'][0]['name']print(d1)
2. 获取test的孩子们d2 = dic['children']print(d2)
3. 获取test的第一个孩子d3 = dic['children'][0]print(d3)
4. test的媳妇姓名变更为 cccdic['wife'][0]['name'] = "ccc"print(dic)
5. test再娶一任妻子dic['wife'].append( {"name":"铁锤","age":19} )print(dic)6. 给test添加一个爱好:吹牛逼dic['hobby'] = "吹牛逼"print(dic)
7. 删除test的年龄del dic['age']或dic.pop('age')print(dic)
"""

二、元组

1、定义

列表(list),是一个有序可变的容器,在里面可以存放多个不同类型的元素。

元组(tuple),是一个有序不可变的容器,在里面可以存放多个不同类型的元素。

Python 的元组与列表类似,不同之处在于元组的元素不能修改。

元组使用小括号 ( ),列表使用方括号 [ ]。

元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可。

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5 )
tup3 = "a", "b", "c", "d"   #  不需要括号也可以

创建空元组

tup1 = ()

建议在元组的最后多加一个逗号,用于标识他是一个元组。特别是元组中只包含一个元素时,需要在元素后面添加逗号 , ,否则括号会被当作运算符使用:

>>> tup1 = (50)
>>> type(tup1)     # 不加逗号,类型为整型
<class 'int'>>>> tup1 = (50,)
>>> type(tup1)     # 加上逗号,类型为元组
<class 'tuple'>

元组与字符串类似,下标索引从 0 开始,可以进行截取,组合等。 

user_list = ("范德彪","刘华强",'尼古拉斯赵四',)
print( user_list[0] )
print( user_list[2] )
print( user_list[3] )#切片
print( user_list[0:2] )
print( user_list[1:] )
print( user_list[:-1] )#步长演示
user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能")
print( user_list[1:4:2] )
print( user_list[0::2] )
print( user_list[1::2] )
print( user_list[4:1:-1] )

2、访问元组

元组可以使用下标索引来访问元组中的值,如下实例:

tup1 = ('Google', 'Runoob', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])结果
tup1[0]:  Google
tup2[1:5]:  (2, 3, 4, 5)

3、获取长度

user_list = ("范德彪","刘华强",'尼古拉斯赵四',)
print( len(user_list) )

4、 for循环

# in 运算符
user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能")
for item in user_list:print(item)# 下标user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能")
for item in user_list:if item == '刘华强':continueprint(name)#目前:只有 str、list、tuple 可以被for循环。 "xxx"  [11,22,33]  (111,22,33) 
# len + range + for + 索引
user_list = ("范德彪","刘华强",'尼古拉斯赵四',"宋小宝","刘能")
for index in range(len(user_list)):item = user_list[index]print(item)

5、修改元组

元组中的元素值是不允许修改的,但我们可以对元组进行连接组合,如下实例:

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')# 以下修改元组元素操作是非法的。
# tup1[0] = 100# 创建一个新的元组
tup3 = tup1 + tup2
print (tup3) # (12, 34.56, 'abc', 'xyz')

6、删除元组

元组中的元素值是不允许删除的,但我们可以使用del语句来删除整个元组,如下实例:

#!/usr/bin/python3tup = ('Google', 'Runoob', 1997, 2000)print (tup)
del tup
print ("删除后的元组 tup : ")
print (tup)以上实例元组被删除后,输出变量会有异常信息,输出如下所示:
删除后的元组 tup : 
Traceback (most recent call last):File "test.py", line 8, in <module>print (tup)
NameError: name 'tup' is not defined

7、元组运算符

与字符串一样,元组之间可以使用 +、+=和 * 号进行运算。这就意味着他们可以组合和复制,运算后会生成一个新的元组。

相加:两个列表相加获取生成一个新的列表。

data = ("赵四","刘能") + ("宋晓峰","范德彪")
print(data) # ("赵四","刘能","宋晓峰","范德彪")v1 = ("赵四","刘能")
v2 = ("宋晓峰","范德彪")
v3 = v1 + v2
print(v3) # ("赵四","刘能","宋晓峰","范德彪")

相乘,列表*整型 将列表中的元素再创建N份并生成一个新的列表。

data = ("赵四","刘能") * 2
print(data) # ("赵四","刘能","赵四","刘能")v1 = ("赵四","刘能")
v2 = v1 * 2
print(v1) # ("赵四","刘能")
print(v2) # ("赵四","刘能","赵四","刘能")

8、元组索引,截取

因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以截取索引中的一段元素,如下所示:元组:>>> tup = ('Google', 'Runoob', 'Taobao', 'Wiki', 'Weibo','Weixin')
>>> tup[1]
'Runoob'
>>> tup[-2]
'Weibo'
>>> tup[1:]
('Runoob', 'Taobao', 'Wiki', 'Weibo', 'Weixin')
>>> tup[1:4]
('Runoob', 'Taobao', 'Wiki')
>>>

 9、转换

其他类型转换为元组,使用tuple(其他类型),目前只有字符串和列表可以转换为元组。

name = "测试"
data = tuple(name)
print(data) # 输出 ("测","试")name = ["测试",18,"pythonav"]
data = tuple(name)
print(data) # 输出 ("测试",18,"pythonav")

10、嵌套

由于元组和列表都可以充当容器,他们内部可以放很多元素,并且也支持元素内的各种嵌套。 

tu = ( 'a', 'b', ('c','d') )
tu1 = tu[0]
tu2 = tu[1]
tu3 = tu[2][0]
tu4 = tu[2][1]
tu5 = tu[2][1][3]print(tu1) # a
print(tu2) # b
print(tu3) # c
print(tu4) # d

11、关于元组是不可变的

所谓元组的不可变指的是元组所指向的内存中的内容不可变。

>>> tup = ('r', 'u', 'n', 'o', 'o', 'b')
>>> tup[0] = 'g'     # 不支持修改元素
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(tup)     # 查看内存地址
4440687904
>>> tup = (1,2,3)
>>> id(tup)
4441088800    # 内存地址不一样了

从以上实例可以看出,重新赋值的元组 tup,绑定到新的对象了,不是修改了原来的对象。

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

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

相关文章

【华为OD题库-032】数字游戏-java

题目 小明玩一个游戏。系统发1n张牌&#xff0c;每张牌上有一个整数。第一张给小明&#xff0c;后n张按照发牌顺序排成连续的一行。需要小明判断&#xff0c;后n张牌中&#xff0c;是否存在连续的若干张牌&#xff0c;其和可以整除小明手中牌上的数字. 输入描述: 输入数据有多组…

嵌入式基础知识学习:Flash、EEPROM、RAM、ROM

https://blog.csdn.net/y673533511/article/details/87913989 FLASH存储器又称闪存&#xff0c;它结合了ROM和RAM的长处&#xff0c;不仅具备电子可擦出可编程(EEPROM) 的性能&#xff0c;还不会断电丢失数据同时可以快速读取数据 (NVRAM 的优势)&#xff0c;U 盘和MP3 里用的…

[论文笔记]MatchPyramid

引言 又一篇文本匹配论文Text Matching as Image Recognition,论文题目是 文本匹配当成图像识别。 挺有意思的一篇工作,我们来看它是如何实现的。 作者受到卷积神经网络在图像识别中成功应用的启发,其中神经元可以捕获很多复杂的模式,作者提出将文本匹配看作是图像识别任…

DDD落地:从网易新闻APP重构,看DDD的巨大价值

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 谈谈你的DDD落地经验&#xff1f; 谈谈你对DDD的理解&#x…

GEE:梯度提升树(Gradient Boosting Tree)分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

作者:CSDN @ _养乐多_ 本文将介绍在Google Earth Engine (GEE)平台上进行梯度提升树(Gradient Boosting Tree)分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量(各种指数、纹理特征、时间序列特征、物候特征…

OpenStack云计算平台-启动一个实例

目录 一、创建虚拟网络 ​二、创建m1.nano规格的主机 三、生成一个键值对 四、增加安全组规则 ​五、启动一个实例 1、确定实例选项 2、创建实例 3、使用虚拟控制台访问实例 4、验证能否远程访问实例 一、创建虚拟网络 下面的说明和框图使用示例IP 地址范围。你必须依…

Altium Designer学习笔记12

把几个层理解下&#xff1a; layer名称功能说明信息Toplayer信号层铜箔层&#xff0c;电气连接的层Bottomlayer信号层铜箔层&#xff0c;电气连接的层Internal Planes内层连接地和电源上&#xff0c;一般情况下不布线&#xff0c;是由整片铜膜组成的Mechanical 1机械层电路板机…

String 、StringBuffer 和 StringBuilder 的区别?

String 使用 String 声明一个字符串的时候&#xff0c;该字符串会存放在堆中的字符串常量池中。因为在java中所有的String 都是以常量表示&#xff0c;且由 final 修饰&#xff0c;因此在线程池中它的线程是安全的 且 不可变的 。每个 String 在被创建后就不再发生任何变化。 …

mysql按年、季度、月,统计

以下是按年、按季度和按月统计SQL查询语句&#xff1a; 按年统计&#xff1a; SELECTds.checker,YEAR(ds.create_time) AS settleYear,SUM(ds.quantity) AS quantity,SUM(ds.approval_price) AS approvalPrice FROMdata_settle ds WHEREds.delete_flag 0AND ds.approval_sta…

漏洞盒子公益SRC

漏洞盒子公益SRC&#xff0c;小小地记录一下第一个月的成果

数据中台建设方法论

1、数仓的概念和了解--业务的痛点 产生的痛点&#xff1a;数据资产比较模糊、数据的质量比较低、重复建设、代码的耦合性比较强。 2、数据仓库中的常见的模型&#xff1a; 1、心型模型&#xff1a;中间是一张事实表&#xff0c;周围都是维度表。 对于心型模型的主要的特点&a…

面向未来的自动化:拥抱机器人即服务(RaaS)

01. RaaS是什么&#xff1f; 对于希望实现业务流程自动化的公司来说&#xff0c;机器人通常是一笔巨大的资本支出。由于机器人非常昂贵&#xff0c;公司可能需要等待数年才能看到投资回报。正是由于这一现实&#xff0c;许多较小的组织无法投资机器人。 但一些机器人公司正在采…

算法通关村第十二关-青铜挑战字符串

大家好我是苏麟 , 今天带来字符串专题 . 转换成小写字母 描述 : 给你一个字符串 s &#xff0c;将该字符串中的大写字母转换成相同的小写字母&#xff0c;返回新的字符串。 题目 : LeetCode 709.转换成小写字母 : 709. 转换成小写字母 分析 : 这个题可以先遍历整个字符串…

Mybatis和MybatisPlus:数据库操作工具的对比

目录 什么是mybatis 什么是mybatisplus MyBatis-Plus&#xff1a;为简化数据库操作而生的强大工具 一、MyBatis-Plus的背景和概述 二、MyBatis-Plus的主要特点 三、如何使用MyBatis-Plus mybatis-Plus的优势 什么是Hibernate Hibernate&#xff1a;Java开发者的数据持久…

光谱图像超分 Benchmark

光谱图像超分 Benchmark 文章目录 光谱图像超分 Benchmark0. pioneer工作及综述基于深度学习的高光谱多光谱融合&#xff08;updating&#xff09;1. 空间光谱图像超分 &#xff08;to be updated&#xff09;2. 高分辨率多光谱图像超分&#xff08;to be updated&#xff09;3…

重生之我是一名程序员 39 ——C语言题目之青蛙跳台阶

哈喽啊大家晚上好&#xff01;今天给大家带来的是C语言经典题目之青蛙跳台阶。青蛙跳台阶是一个数学问题&#xff0c;也是一个经典的递归问题。假设一只青蛙要跳上一个n级台阶&#xff0c;它可以每次跳1级台阶或2级台阶。问&#xff1a;青蛙跳上这个n级台阶总共有多少种不同的跳…

AMESim|学习记录

此文记录AMESim学习过程中的各种情况。 目录 01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017.01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017. 01 王佳. AUV 浮力调节系统设计及控制策略研究[D]. 天津大学, 2017. 开始步入正文 01 王佳.…

【Leetcode合集】14. 最长公共前缀

14. 最长公共前缀 14. 最长公共前缀 代码仓库地址&#xff1a; https://github.com/slience-me/Leetcode 个人博客 &#xff1a;https://slienceme.xyz 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例 …

【UE】用样条线实现测距功能(下)

目录 效果 步骤 一、实现多次测距功能 二、通过控件蓝图来进行测距 在上一篇&#xff08;【UE】用样条线实现测距功能&#xff08;上&#xff09;&#xff09;文章基础上继续实现多次测距和清除功能。 效果 步骤 一、实现多次测距功能 打开蓝图“BP_Spline”&#xff0c…

cherry pick的使用

https://blog.csdn.net/weixin_55229531/article/details/128726872