Python之基础数据类型(二)

目录

  • 列表 list
        • 初始化
        • 切片(有序)
        • 可变数据类型
        • 存放任何数据类型
      • 常用方法
      • 运算
      • 底层存储(地址值的传递)
      • 遍历
      • 示例
  • 元组 tuple
      • 初始化
      • 与list的主要区别是不可变
      • 运算
      • 与list相互转换
  • 字典 dict
      • 初始化
      • 删除
      • 字典的合并
      • in、not in、values()
      • 遍历
      • 常见应用格式
      • 与列表、元组的转换
      • json 格式的转换
      • 字典底层原理--空闲哈希表
  • 集合 set
      • 初始化
      • 与list的转换
      • 添加、删除
      • 集合运算
    • 小结


列表 list

1、是一个有序的项目集合
2、是可变数据类型
3、可以存放任何数据类型

初始化

lst = []	# 方式一
print(type(lst))  # <class 'list'>
lst2 = list()	# 方式二
print(lst2, type(lst2))  # [] <class 'list'>
lst3 = list("abc")  # 参数传递必须为可迭代对象,即可用for循环遍历
print(lst3)  # ['a', 'b', 'c']

切片(有序)

切片与字符串一模一样

>>> lst = ['x', "y", 1, None]
>>> print(lst[::-1])
[None, 1, 'y', 'x']
# 可以使用切片赋值,当传递的参数超过切片长度时,会自动依次添加到切片后面的位置,相当于insert(),列表长度增加;当参数长度小于切片长度时相当于替换replace(),列表长度减小
lst[0:2]="abc"

可变数据类型

# 使用下标或切片进行赋值都不会重新产生一个列表,列表所指向的内存空间不会改变
>>> lst=[]
>>> print(lst,id(lst))
[] 140687159259336
>>> lst[0]='a'	# 下标不能溢出,replace()
Traceback (most recent call last):File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range
>>> lst[0:]='a'		# 切片可以溢出,溢出即插入,不溢出就替换
>>> print(lst,id(lst))
['a'] 140687159259336
>>> lst[0]='b'
>>> print(lst,id(lst))
['b'] 140687159259336
# 使用"lst="赋值时会产生新的列表,相当于重定向
>>> lst=['c']
>>> print(lst,id(lst))
['c'] 140687159250760

存放任何数据类型

# 可以存放任何数据类型,包括函数、类
lst.append(print)  # 这里print不加()代表加入print函数,加了括号代表返回值
print(lst)

常用方法

print(dir(list))  # 查看所有方法
# 增
lst.append(['a', 'b'])  # append()在末尾添加元素 这里添加了个列表
lst.insert(0, list)  # insert()在指定位置插入元素   这里插入了list类
lst.extend("abc")  # extend()在末尾添加列表,必须也是可迭代对象,相当于 +
# 删
lst.pop(2)  # pop()删除指定位置的元素,默认最后一个
lst.remove('x')  # remove()删除指定元素
lst.clear()  # clear()清空列表
# 改
lst.reverse()  # reverse()反转,会改变原列表值
lst = ['x', 'y', '31', '241']
lst.sort()  # sort()排序,字符串通过unicode码进行排序,list和string不能同时存在,str和int也不能同时存在
# 统计(查)
print("************************")
print(len(lst))
print(lst.count("x"))
print(lst.index("x"))#  返回下标
lst=[1,2,3,4,5,6]
print(max(lst))
print(min(lst))
print(sum(lst))

运算

>>> lst = ['x', 'y']
>>> lst2 = ['a', 'b']
>>> lst3 = lst + lst2	# 加法
>>> print(lst3, id(lst), id(lst2), id(lst3))
['x', 'y', 'a', 'b'] 140687159259336 140687159250760 140687159259400
>>> lst3 = lst * 2		# 乘法
>>> print(lst3)
['x', 'y', 'x', 'y']

底层存储(地址值的传递)

>>> lst4 = lst3  # 这样的赋值传递的是地址值
>>> print(id(lst3), id(lst4))
140687159259656 140687159259656
# 当其中一个改变了,其他指向这个地址值的的变量也会变,
# 与string不同,string是不可变数据类型,当变量改变时,string变量底层是指向了另一个地址,原地址的值不会变
>>> lst3.append("zz")
>>> print(lst3, lst4)
['x', 'y', 'x', 'y', 'zz'] ['x', 'y', 'x', 'y', 'zz']
# 使用copy()或者切片就不会指向同一个地址
... lst5 = lst3.copy()
>>> print(id(lst3), id(lst5))
140687159259656 140687159259400
>>> lst6 = lst3[:]
>>> print(id(lst3), id(lst6))
140687159259656 140687159260168

遍历

>>> for i in lst3:	# 遍历每个元素
...     print(i)
... 
x
y
x
y
zz
>>> for k, v in enumerate(lst3):  # 类似go的遍历,k为下标(从0开始),v为值(类型为str)
...     print(k, v)
... 
0 x
1 y
2 x
3 y
4 zz

示例

对输入的字符串只保留字母和数字,然后再进行判断是否为回文

while 1:str1 = input(":")if str1=="q":breakstr2 = ""for i in str1:if i.isalnum():		# 字符串保留字符数字str2 += istr2 = str2.lower()		# 忽略大小写if str2 == str2[::-1]:	# 反转字符串进行比较print("是回文")else:print("不是回文,请重新输入,按q退出")

对于一个已知的整数列表,给出一个整数,判断列表中是否有两个数相加与其相等

# 示例:lst = [2,4,6,7,3,5,9,12]
# 从键盘输入一个数, 10  --》10=4+6 --》输出下标:1,2
lst=[3,5,7,11,13,17,2,1]
num=int(input("请输入一个整数:"))
flag1=1
for k,v in enumerate(lst[:len(lst)-1]):for i in lst[k+1:]:if int(v)+int(i)==num:print(f"{num}={v}+{i}")flag1=0
if flag1==1:print(f"没有两个数加起来等于{num}")

元组 tuple

初始化

# 方式一
>>> t1 = (1)  # 一个元素无法识别是元组还是括号,此时为int类型
>>> t2 = (1,)  # 一个元素加个逗号就行
>>> t3 = (1, 2)
>>> print(type(t1), type(t2), type(t3))
<class 'int'> <class 'tuple'> <class 'tuple'>
# 方式二
>>> b=tuple("abc")
>>> print(b)
('a', 'b', 'c')

可以存放任意数据类型

可以切片

与list的主要区别是不可变

不可变数据类型,改变任意地址值都会报错:TypeError: ‘tuple’ object does not support item assignment

>>> t3[1]=1
Traceback (most recent call last):File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

元组内存放可变数据类型时,改变可变数据类型的值是可以的,因为元组的地址值并没有改变

>>> t4 = ("x", "abc", [1, 2, 3])
>>> t4[2].append(4)
>>> print(t4)
('x', 'abc', [1, 2, 3, 4])

运算

# 运算也可以,相加会生成新元组
print(t3 + t4)

与list相互转换

lst = list(t4)
print(lst, type(lst))
t5 = tuple(lst)
print(t5, type(t5))

字典 dict

键值映射的数据结构、无序、可变数据类型

初始化

d1 = {"name": "wenyao", "age": 18}
print(d1["name"])  		# key不存在时会报错
d1["gender"] = "female"  # key不存在时新增,存在时重新赋值
d1.get("xx", 1)  		# key不存在时不会报错,默认返回值为None,也可以指定key不存在时的返回值,这里指定为 1

key 自动去重,后面的覆盖前面的

>>> d2 = {1: "a", 2: "b", 2: "c"}
>>> print(d2)
{1: 'a', 2: 'c'}

key必须为可hash对象,暂时理解为不可变数据类型,字符串、元组都行(但元组里的元素也得是不可变数据),列表不行

value可以是任何值

删除

d1 = {1: "x", 2: "y"}
print(d1.pop(1))  	# pop()删除指定key,返回velue值
print(d1.popitem())  # popitem(),默认删除最后一个key,返回(key,value)

字典的合并

>>> print(d1, d2)
{1: 'x', 2: 'y'} {1: 'a', 2: 'c'}
>>> d1.update(d2)  # 将d2合并到d1,d2值不变,d1值改变
>>> print(d1, d2)
{1: 'a', 2: 'c'} {1: 'a', 2: 'c'}
>>> d1 = {"a": 1}
>>> d2 = {"b": 2}
>>> d3 = dict(d2, **d1)  # 将d1和d2合并成新的字典,d1 d2的值都不变,key类型必须为string,且需要符合变量名规范
>>> print(d1, d2, d3)
{'a': 1} {'b': 2} {'b': 2, 'a': 1}

in、not in、values()

>>> print("b" in d3, 2 in d3)  # 这样判断的是key
True False
>>> print(2 in d3.values())  # values()返回values列表,类型为'dict_values'
True
>>> print(type(d3.values()))
<class 'dict_values'>

遍历

for i in d3:  # 只返回keyprint(i)
for i in d3.items():  # 返回(key,value),类型为元组print(i)
for k, v in d3.items():  # 分别赋值key、valueprint(f"{k}->{v}")
for i in d3.values():  # 只返回valueprint(i)

常见应用格式

d1 = {"root": {"passwd": "123456", "balance": 500}, "admin": {"passwd": "123456admin", "balance": 300}}
print(d1["root"]["passwd"])		# 方式一
print(d1.get("root").get("passwd"))		# 方式二

与列表、元组的转换

>>> lst = [("a", 1), ("b", 2)]  # 只有这种列表里是元组且是键值对形式的才可以转字典
>>> d4 = dict(lst)
>>> print(d4)
{'a': 1, 'b': 2}
>>> print(list(d4))  # 得到 key 列表
['a', 'b']
>>> print(list(d4.items()))  # 得到 (key,value) 列表
[('a', 1), ('b', 2)]

json 格式的转换

json 是一种轻量型的数据交换格式,可用于字符串与字典的转换

>>> import requests
>>> result = requests.get("https://dhfmainapi.360dhf.cn/api/v2/zy-order-pay-log/real-time-overview")
>>> str1 = result.text  # 得到一个json格式的字符串
>>> print(type(str1), str1)
<class 'str'> {"code":400,"data":null,"message":"请先登录"}
>>> import json
>>> d1 = json.loads(str1)  # 将字符串转换成字典
>>> print(type(d1), d1)
<class 'dict'> {'code': 400, 'data': None, 'message': '请先登录'}
>>> d1["test"] = "abc"
>>> str2 = json.dumps(d1)  # 将字典转换成字符串
>>> print(type(str2), str2)  # 汉字会被转换为unicode编码
<class 'str'> {"code": 400, "data": null, "message": "\u8bf7\u5148\u767b\u5f55", "test": "abc"}

字典底层原理–空闲哈希表

参考链接:为什么Python 3.6以后字典有序并且效率更高? - 知乎 (zhihu.com)

对于d1={“a”:1},在空闲散列表中先加密,根据**哈希值最后一位数(或者取余)**确定存储位置,(为什么要加密?因为通过取余可以快速找到数据位置)

如果有其他元素的尾数一样(散列冲突),则用开放地址寻址法,使用开放地址函数,一般是向下寻找

先记住:表中存储的是key哈希值、key地址值、value地址值

indices存放元素在entries里的具体位置

hash算法:把任意长度的输入,变成固定长度的输出,单向加密算法,一种明文只对应一种密文,不过极小概率不同的明文对应同一种密文

破解:撞库(存储一些明密文的对应) --> 解决:加盐(密文长度加长)

应用:1.数据加密

2.签名摘要(防止篡改或完整性验证):通过对整个文件加密得到哈希值,然后接收方接收后对文件进行加密验证看是否与之前一致

Linux体验之MD5,命令:echo xxx |md5sum 或者 md5sum xxx.txt可以加密语句也可以加密文件

集合 set

集合(set)可以理解为只有key的字典

因此,key唯一,无序,key得是可hash对象————不可变

初始化

>>> s1={1,2,3}		# 方式一
>>> s2=set()		# 方式二
>>> print(type(s1),type(s2))
<class 'set'> <class 'set'>
>>> s3={}
>>> print(type(s3))		# 使用{}初始化的数据类型是字典
<class 'dict'>

与list的转换

通过set()、list()函数可以相互转换

>>> lst=[1,2,3]
>>> s3=set(lst)		# 如果有重复的会去掉
>>> print(s3)
{1, 2, 3}
>>> lst2=list(s3)
>>> print(lst2)
[1, 2, 3]

添加、删除

>>> # 添加
... s1.add(4)	#  添加到末尾
>>> s1.update("abc")	# 只能添加可迭代对象,然后一个一个add
>>> # 删除
... s1.remove(4)	# 删除指定元素,没有就报错
>>> s1.discard(4)	# 不会报错
>>> print(s1)
{1, 2, 3, 'b', 'c', 'a'}
>>> s1.remove(4)	# 删除指定元素,没有就报错
Traceback (most recent call last):File "<stdin>", line 1, in <module>
KeyError: 4

集合运算

#运算 -:差集,在a不在b  &:交集  |:并集,ab所有元素  ^:对称差集,只在a或者只在b
a={1,2,3}
b={2,3,4}
print(a.union(b))#      |
print(a.intersection(b))#   &
print(a.difference(b))#     -
print(a.symmetric_difference(b))#   ^

小结

本节文章主要讲解了python中的容器类型,包括列表、元组、字典和集合,内容包含了其特点和常用方法,帮助大家快速了解容器类型的使用和异同。如有不足之处,希望能帮忙指出,笔者会及时改正,感谢大家观看!

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

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

相关文章

Ubuntu离线或在线安装CMake

首先下载适用于Ubuntu的CMake安装包&#xff0c;可以去官网下载&#xff0c;也可以通过下面的命令下载&#xff08;需要联网&#xff09;&#xff1a; wget https://cmake.org/files/v3.22/cmake-3.22.1.tar.gz将下载的安装包进行解压&#xff1a; tar -xvzf cmake-3.22.1.ta…

本地如何使用HTTPS进行调试

在现代前端开发中&#xff0c;HTTPS已经成为不可或缺的一部分&#xff0c;因为它在保护用户数据和确保网站安全性方面发挥着关键作用。然而&#xff0c;有时在本地开发过程中启用HTTPS可能会变得有些复杂。在本文中&#xff0c;我们将介绍如何轻松地在本地进行HTTPS调试&#x…

JVM学习(五)--方法区

概念&#xff1a; 方法区就是存和类相关的东西&#xff0c;成员方法&#xff0c;方法参数&#xff0c;成员变量&#xff0c;构造方法&#xff0c;类加载器等&#xff0c;逻辑上存在于堆中&#xff0c;但是不同的虚拟机对它的实现不同&#xff0c;oracle的hotsport vm在1.6的时…

U-net网络学习记录

U-net网络 本质上是一个用于图像分割的神经网络 输入是一幅图&#xff0c;输出是目标的分割结果。继续简化就是&#xff0c;一幅图&#xff0c;编码&#xff0c;或者说降采样&#xff0c;然后解码&#xff0c;也就是升采样&#xff0c;然后输出一个分割结果。根据结果和真实分…

uwsgi部署多进程django apscheduler与问题排查

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;开源建设者与全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland)&…

基于Simulink的用于电力系统动态分析

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【正版软件】Air Explorer - 一个程序访问您的所有云服务

前言&#xff1a;Air Explorer支持最好的云服务。 功能特点&#xff1a; 直接管理云中的文件 设置同一服务上的多个帐户 您可以在任何云服务或计算机之间同步文件夹 云文件浏览器易于使用 通过加入您的所有云服务来增加存储空间 应用程序适用于Windows/Mac Air Explorer…

vue+antd——table组件实现动态列+表头下拉选择功能——技能提升

Table 表格 展示行列数据。 何时使用 当有大量结构化的数据需要展现时&#xff1b; 当需要对数据进行排序、搜索、分页、自定义操作等复杂行为时。 最近在写vueantd的框架&#xff0c;遇到一个需求&#xff1a;就是要实现table表格的动态列&#xff0c;并且相应的表头要实现下拉…

Scrapy的基本介绍、安装及工作流程

一.Scrapy介绍 Scrapy是什么&#xff1f; Scrapy 是用 Python 实现的一个为了爬取网站数据、提取结构性数据而编写的应用框架(异步爬虫框架) 通常我们可以很简单的通过 Scrapy 框架实现一个爬虫&#xff0c;抓取指定网站的内容或图片。 Scrapy使用了Twisted异步网络框架&…

攻防世界-WEB-NewsCenter

打开环境 有查询&#xff0c;猜测是sql注入 保存请求头到文件中 准备利用sqlmap 查找数据库 python sqlmap.py -r ./123.txt --dbs 查找表 python sqlmap.py -r ./123.txt --tables -D news 查找字段 python sqlmap.py -r ./123.txt --column -D news -T secret_table 显示字…

【Java Web】Servlet规范讲解

目录 一、前言 二、Servlet规范介绍 2.1 常见版本及新功能 2.2 Servlet的作用 2.3 Servlet的本质 三、Servlet接口和实现类 3.1 Servlet接口 3.2 Servlet接口实现类示例 3.3 Servlet接口实现类开发步骤 3.3.1 关键点 3.3.2 引入Servlet源码包 1、描述 Servlet接口…

Java-day13(IO流)

IO流 凡是与输入&#xff0c;输出相关的类&#xff0c;接口等都定义在java.io包下 1.File类的使用 File类可以有构造器创建其对象&#xff0c;此对象对应着一个文件(.txt,.avi,.doc,.mp3等)或文件目录 File类对象是与平台无关的 File中的方法仅涉及到如何创建&#xff0c;…

OpenCV(二十三):中值滤波

1.中值滤波的原理 中值滤波&#xff08;Median Filter&#xff09;是一种常用的非线性图像滤波方法&#xff0c;用于去除图像中的椒盐噪声等离群点。它的原理是基于邻域像素值的排序&#xff0c;并将中间值作为当前像素的新值。 2.中值滤波函数 medianBlur() void cv::medianBl…

dyld: Symbol not found: __ZNSt3__113basic_filebufIcNS_11char_traitsIcEEEC1Ev

问题描述 当我修改了几行代码&#xff0c;build了新的lib并集成到app以后&#xff0c;app 在mac11 的OS上运行良好&#xff0c;但是在 mac11 以及更多版本上&#xff0c;app持续crash&#xff0c;launch不起来。 使用terminal 打开app的时候&#xff0c;输出如下错误&#xff…

怎么把视频转换成mp4格式

怎么把视频转换成mp4格式&#xff1f;如今&#xff0c;随着科技的不断发展&#xff0c;我们在工作中接触到的多媒体视频格式也越来越多。其中&#xff0c;MP4作为一种广泛兼容的视频格式&#xff0c;在许多软件中都能轻松播放&#xff0c;并且成为了剪辑与裁剪视频时大家常用的…

2023年高教社杯数学建模国赛 赛题浅析

2023年国赛如期而至&#xff0c;为了方便大家尽快确定选题&#xff0c;这里将对赛题进行浅析&#xff0c;以分析赛题的主要难点、出题思路以及选择之后可能遇到的难点进行说明&#xff0c;方便大家尽快确定选题。 难度排序 B>A>C 选题人数 C>A>B (预估结果&…

机器学习笔记之最优化理论与方法(三)凸集的简单认识(下)

机器学习笔记之最优化理论与方法——凸集的简单认识[下] 引言回顾&#xff1a;基本定义——凸集关于保持集合凸性的运算仿射变换 凸集基本性质&#xff1a;投影定理点与凸集的分离支撑超平面定理 引言 继续凸集的简单认识(上)进行介绍&#xff0c;本节将介绍凸集的基本性质以及…

HTTPS加密协议详解:HTTPS性能与优化

1、HTTPS性能损耗 前文讨论了HTTPS原理与优势&#xff1a;身份验证、信息加密与完整性校验等&#xff0c;且未对TCP和HTTP协议做任何修改。但通过增加新协议以实现更安全的通信必然需要付出代价&#xff0c;HTTPS协议的性能损耗主要体现如下&#xff1a; (1).增加延时 分析前…

C++ primer plus第十二章编程练习答案

1.对于下面的声明: class Cow{ char name[20] ; char hobby; double weight ; public: Cow(); Cow(const char * nm&#xff0c;const char * ho,double wt); Cow(const Cow c&); ~Cow(); Cow operator(const Cow & c); void ShowCow() const; // display all cow da…

02-zookeeper分布式锁案例

1 Zookeeper分布式案例 1.1 Zookeeper分布式锁原理 核心思想&#xff1a;当客户端要获取锁&#xff0c;则创建节点&#xff0c;使用完锁&#xff0c;则删除该节点。 当我们假设根节点/ 下有/locks节点时 1&#xff09;客户端获取锁时&#xff0c;在locks节点下创建临时顺序…