python内置数据结构_Python基础知识2-内置数据结构(下)
bytes、bytearray
#思考下面例子:
a = 1b=aprint(a == b)#True
print(a is b)#True
print(id(a) is id(b))#False
print(id(a) == id(b))#True
1. id():获取的是对象在内存中的地址2. is:比对2个变量的对象引用(对象在内存中的地址,即id() 获得的值)是否相同。如果相同则返回True,否则返回False。换句话说,就是比对2个变量的对象引用是否指向同一个对象。3. ==:比对2个变量指向的对象的内容是否相同。
参考:https://segmentfault.com/q/1010000015117621
#用id(expression a) == id(expression b)来判断两个表达式的结果是不是同一个对象的想法是有问题的#只有你能保证对象不会被销毁的前提下,你才能用 id 来比较两个对象
print(id(a.__init__) == id(a.zhuangshi))#True
z =a.__init__x=a.zhuangshiprint(id(z) == id(x))#False
print(id(1)is id(1))#False
print(id(1) == id(1))#False
参考:https://www.jianshu.com/p/Rvkrdb
bytes定义
bytes操作
bytearray定义
bytearray操作
线性结构
切片
练习:
#要求m行k个元素#思路1:m行有m个元素,k不能大于m,这个需求需要保存m行的数据,那么可以使用一个嵌套机构[[],[],[]]
triangle=[]
m=5k=4
for i in range(m):#0~4#杨辉三角每行都是以1开头
row=[1]
triangle.append(row)if i==0:continue
for j in range(1,i):
row.append(triangle[i-1][j-1]+triangle[i-1][j])
row.append(1)print(triangle)print(triangle[m-1][k-1])#上例测试效率:
#思路2:根据杨辉三角的定理:第m行的第k个数可表示为C(m-1,k-1),即为从m-1个不同的元素中取k-1个元素的组合数。
#利用c(n,r)=n!/(r!(n-r)!)
m=9k=5n= m-1r= k-1d= n-r
targets= [] #r,n-r,n
factorial=1
for i in range(1,n+1):
factorial*=iif i==r:
targets.append(factorial)if i==d:
targets.append(factorial)if i==n:
targets.append(factorial)print(targets[2]//(targets[0]*targets[1]))#上例测试效率:
练习2
#方法1,常规写法
matrix = [[1,2,3],[4,5,6],[7,8,9]]
count=0for i inrange(len(matrix)):for j in range(i):#j
matrix[i][j]=matrix[j][i]
count+=1
print(matrix)#方法2:利用enumerate函数创建索引
matrix = [[1,2,3],[4,5,6],[7,8,9]]
count=0for i,row inenumerate(matrix):for j inenumerate(row):if i
matrix[i][j]=matrix[j][i]
count+=1
print(matrix)
练习3
#思路1:首先新建一个空的列表tm,扫描matrix第一行,在tm的第一列从上至下附加,然后在第二列附加,以此列推。
matrix = [[1,2],[3,4],[5,6]]
tm=[]for row inmatrix:for index,col inenumerate(row):if len(tm)
tm.append([])
tm[index].append(col)print(tm)#思路2:考虑能否一次性开辟好空间目标矩阵的内存空间?如果能够一次性开辟好空间目标矩阵内存空间,那么原矩阵的元素直接移动到转置矩阵的对称坐标就行了#在原有矩阵上改动,牵扯到增加元素和减少元素,有些麻烦,所以,定义一个新的矩阵输出
matrix = [[1,2,3],[4,5,6]]
tm=[[0 for col in range(len(matrix))]for row inrange(len(matrix[0]))]
count=0for i,row inenumerate(tm):for j,col inenumerate(row):
tm[i][j]=tm[j][i]
count+=1
print(matrix)print(tm)print(count)
#考虑上面两种方法的时间效率比较:(对于大矩阵运算,方法二效率更高一些)#测试发现,其实只要增加到4*4的矩阵,方法二的优势就开始了。#矩阵规模越大,先开辟空间比后append的效率高!
练习4
#思路:利用类似linux中位图的思想来记录当前标记数字是否重复出现
importrandom
nums=[]for _ in range(10):
nums.append(random.randrange(1,21))
length=len(nums)
samenums=[] #记录相同的数字
diffnums=[] #记录不同的数字
states=[0]*length #记录不同的索引异同状态
for i inrange(length):
flag= False #该状态表示没有重复
if states[i]==1:continue
for j in range(i+1,length):#对每一个数将其与之前的数进行比较
if states[j]==1:continue
if nums[i]==nums[j]:
flag=True
states[j]=1
ifflag:
samenums.append(nums[i])
states[i]=1
else:
diffnums.append(nums[i])print(samenums)print(diffnums)
IPython的使用
帮助
shell命令
特殊变量
魔术方法
封装和解构
解构(unpack)
Python3的解构
丢弃变量
lst=list(range(10))
_,sec,_four,*_,2tail,_=lst
#题目1
_,(*_,a),_=lst#题目2
s="JAVA_HOME=/usr/bin"name,_,path=s.partition('=')#题目3
lst = [1,9,8,5,6,7,4,3,2]for i inrange(len(lst)):
flag=Falsefor j in range(len(lst)-i-1):if(lst[j+1]
lst[j+1],lst[j]=lst[j],lst[j+1]
flag=Trueif notflag:break小结:
解构,是Python提供的很好的功能,可以方便的提取复杂数据结构的值。
配合_的使用,会更加顺利。
集set
set定义初始化
初始化set的时候,里面的元素不能是可变类型,如list,bytearray等
set的元素
set增加
set删除
注意这里的remove是根据hash值来找到元素并移除的!所以时间复杂度是O(1).
set修改、查询
这个效率相当于用索引访问顺序结构!时间复杂度为O(1)。
set成员运算符的比较
可以看出set集合查询效率跟数据规模无关!
set和线性结构
集合
集合运算
解题思路:
集合练习
#利用集合来解决
简单选择排序
简单选择排序代码实现(一)
简单选择排序代码实现(二)
#二元选择排序(降序)#lst = [9,2,1,4,5,7,6,8,3]
lst=[1,1,1,1,1,1,1]print("原序列:",lst)
length=len(lst)
count_swap=0
count_iter=0for i in range(length//2):
maxindex=i
minindex= -i-1
#minorginindex = minindex
for j in range(i+1,length-i):#!!!
count_iter += 1
if lst[maxindex]
maxindex=j
count_swap+= 1
if lst[minindex]>lst[-j-1]:
minindex= -j-1count_swap+= 1
if lst[minindex] == lst[maxindex]:#元素相同说明已经有序
break
if i !=maxindex:
lst[maxindex],lst[i]=lst[i],lst[maxindex]#如果minindex的索引被交换过(即刚好最大值的索引和最小值的索引交换过),则需要更新!
if i == minindex+length:
minindex=maxindexif (-i-1) != minindex or (-i-1+length) !=minindex:
lst[minindex], lst[-i-1] = lst[-i-1], lst[minindex]print("排序后:",lst)print("比较次数:{0} 交换次数:{1}".format(count_iter,count_swap))
使用二元排序的时候需要注意几点:1.相比于(一元)简单选择排序,我们需要再添加一个变量来记录极值的下标。2.如果两个极值的下标索引只要有一个被交换过则我们需要注意更新另一个极值的下标索引。3.如果使用了负索引来记录下标,则在比较判断时我们需要注意索引不能为负。
简单选择排序总结
字典dict
字典dict定义初始化
#上述红色标记才是最为常用的初始化格式
字典元素的访问
字典的增加和修改
字典删除
字典遍历
字典练习
waitting...
标准库datetime
注意:total_seconds()是属于timedelta对象的方法!
标准库time
Python解析式、生成器
列表解析
注意一下下列情况:
列表解析进阶
输出都是[(5,24),(6,24)]
列表解析练习
1. [x**2 for x in range(1,11)]2. lst=[1,4,9,16,2,5,10,15]
[lst[i]+lst[i+1] for i in range(len(lst)-1)]3. [print("{}*{}={:<3}{}".format(j,i,i*j,'\n' if i==j else ''),end='' )for i in range(1,10) for j in range(1,i+1)]4 ["{:>04}.{}".format(i,''.join([chr(random.randint(97,123))for _ in range(10)]))for i in range(1,101)]
生成器表达式
结果会报异常:first和second都为None!
集合解析式
字典解析式
总结
内建函数
可迭代对象
迭代器
迭代器不一定是生成器,但生成器本质是迭代器!
字典练习
#按统计次数降序输出
importrandom
random_alphatable= [''.join([chr(random.randint(97,122))for _ in range(2)])for _ in range(1,101)]
dict_count={}for i inrandom_alphatable:if i not indict_count:
dict_count[i]= 1
else:
dict_count[i]+= 1
#即按字典的value排序
res = sorted(dict_count.items(),key=lambda items:items[1],reverse=True)print(type(res))for i inres:print(i,end=" ")
python内置数据结构_Python基础知识2-内置数据结构(下)相关推荐
- python常用变量名_python基础知识整理
Python Python开发 Python语言 python基础知识整理 序言:本文简单介绍python基础知识的一些重要知识点,用于总结复习,每个知识点的具体用法会在后面的博客中一一补充程序: 一 ...
- python中用str乘方_Python基础知识
Python2与Python3的区别: (这里只列举自己总结的几点) Python2: 源码不标准 混乱 重复代码过多 默认使用的编码方式是ASCII码 # 解决对应编码问题 在首行增加 #-*-e ...
- python三种结构_Python基础05 三种基本结构选择结构
作者:玉树[林]风 欢迎转载,也请保留这段声明. 程序的三种基本结构 顺序结构 代码按照编写的顺序,自上而下逐行运行.如下图所示. 代码按照A->B->C的顺序执行 选择结构 代码运行到选 ...
- python的内置数据结构_Python基础知识2-内置数据结构(上)
分类 数值型 用浮点型的时候注意别和"=="一起使用. 数字的处理函数 注意round()函数的特殊:四舍六入五取偶 类型判断 列表list 列表list定义 初始化 列表索引访问 ...
- python write函数换行_Python基础知识(三)
本章小结 学习越往后越意识到总结的重要性 特别是语法基础,东西太多 不用是真的会直接忘掉 我在总结本文的时候就发现 我当时觉得学得很好很扎实 自信不会忘记的东西, 真的已经被我忘掉了 还不得不依靠百度 ...
- python包括哪些部分_python基础知识部分练习大全
1.执行 Python 脚本的两种方式 答:1.>>python ../pyhton.py 2. >>python.py #必须在首行有 #!/usr/bin/env pyth ...
- python变量类型声明_python基础知识:变量的定义以及类型
本文适合编程语言零基础的初学者,有打算转行学习python的可以添加关注,后续小编将会把自己转行学pyhton语言以来的所有笔记,和工作中总结的一些开发经验分享给大家. 变量的定义 在程序中,有时我们 ...
- python怎么输出复数_python基础知识及应用(二)输入输出|递归|深浅拷贝|全局变量|复数...
目录 一.python输入输出 二.迭代 2.1 输入与输出 2.2 解法 三.拷贝 3.1 拷贝实例 3.2 对象的赋值 3.3 浅拷贝 3.4 深拷贝 3.5 拷贝例如 四.set 4.1 题 4 ...
- python怎么编辑文件_Python基础知识之文件的修改操作
今天我们来讨论下python下如何实现:打开文件-修改文件--关闭文件的操作 本文采用逐行解释的方法. 思路: 第一步:把文件读取出来 第二部:再用'w'模式写入到新文件 第三部:把原文件删除,并且把 ...
最新文章
- sql查询远程数据库的表的数据并填充到本地数据库的表
- rsync - 远程同步工具
- java web应用解决乱码问题
- PyQt5 技术篇-QComboBox下拉框绑定监听事件实例演示
- CSP认证201612-1	中间数[C++题解]:遍历
- HDU 1559 最大子矩阵
- concurrent(四)Condition
- 实例方法 java 1614780086
- 泛型接口(C# 编程指南)
- C#坏习惯:通过不好的例子学习如何制作好的代码——第1部分
- Apache2 httpd.conf中文版
- cmd下特殊字符串的处理
- java中判断字符串是否为纯数字
- idea-插件开发 Dialogs
- 群面时被问到“让你淘汰一个组员”一般如何淘汰谁?
- 计算机基础使用操作培训ppt,计算机基础操作培训课件ppt课件.ppt
- iis7.5如何将应用程序池的启动模式(startMode)从onDemand(需要时)更改为AlwaysRunning(一直运行)?
- 用Vue制作图片翻面效果
- 笔记本电脑没有鼠标怎么右键_没有鼠标怎么办?
- 计算机音乐怎么去掉,怎么取消电脑的开机音乐
热门文章
- LSTM时间序列预测及网络层搭建
- C#】通过遍历IFrame访问页面元素
- c# 串口SerialPort
- SQL SERVER提供了大量的WINDOWS和SQLSERVER专用的排序规则
- SQL with(nolock)详解
- Linux 调优方案, 修改最大连接数(ulimit命令)
- Android和ios速度,不拼硬件拼体验 Android和iOS系统的加载速度测验
- python实现字典树 时间复杂度_Python实现字典树
- html制作水晶状态导航栏,HTML5 CSS3水晶风格的页面头部
- java Mina sftp_java – 使用Apache Mina作为模拟/内存SFTP服务器进行单元测试