python内置数据结构_Python基础知识2-内置数据结构(下)

bytes、bytearray

1348316-20190327165014834-656494117.png

1348316-20190327194424368-1634186657.png

1348316-20190327202618092-2013353702.png

#思考下面例子:

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定义

1348316-20190327195247453-671932553.png

bytes操作

1348316-20190327201811274-716009429.png

bytearray定义

1348316-20190328104050195-956642513.png

bytearray操作

1348316-20190328104625171-1023075468.png

1348316-20190328104859864-93168784.png

线性结构

1348316-20190328105057260-673933299.png

切片

1348316-20190328105212305-810252811.png

1348316-20190328105833219-1040054648.png

1348316-20190328105848380-467233560.png

练习:

1348316-20190328110440512-1802936325.png

#要求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])#上例测试效率:

1348316-20190328170809028-1346388456.png

#思路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]))#上例测试效率:

1348316-20190328192226252-378842620.png

练习2

1348316-20190328194223024-1640869530.png

#方法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

1348316-20190328201756203-588929662.png

#思路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)

1348316-20190328212236175-1926442400.png

#考虑上面两种方法的时间效率比较:(对于大矩阵运算,方法二效率更高一些)#测试发现,其实只要增加到4*4的矩阵,方法二的优势就开始了。#矩阵规模越大,先开辟空间比后append的效率高!

练习4

1348316-20190328212826978-225245508.png

#思路:利用类似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的使用

帮助

1348316-20190328145539769-1973427434.png

shell命令

1348316-20190328145442848-221663188.png

特殊变量

1348316-20190328145511725-1879791591.png

魔术方法

1348316-20190328145346330-1058326650.png

1348316-20190328145336838-935049093.png

封装和解构

1348316-20190328145651275-2084993001.png

1348316-20190328145902211-2092508868.png

解构(unpack)

1348316-20190328150046375-1350756192.png

1348316-20190328150223323-1446275121.png

Python3的解构

1348316-20190328151214945-1024172711.png

丢弃变量

1348316-20190328151620597-909611132.png

1348316-20190328151918801-1928245847.png

1348316-20190328152038847-547274187.png

lst=list(range(10))

_,sec,_four,*_,2tail,_=lst

1348316-20190328152328101-2008857943.png

#题目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

1348316-20190328215839445-431517868.png

set定义初始化

1348316-20190328220228754-17930430.png

初始化set的时候,里面的元素不能是可变类型,如list,bytearray等

1348316-20190328220625220-1560378460.png

set的元素

1348316-20190328221006521-28429383.png

1348316-20190426101639399-1346632686.png

set增加

1348316-20190328221158813-184023427.png

set删除

1348316-20190328221726286-1374517609.png

注意这里的remove是根据hash值来找到元素并移除的!所以时间复杂度是O(1).

set修改、查询

1348316-20190328222024577-1496297138.png

这个效率相当于用索引访问顺序结构!时间复杂度为O(1)。

set成员运算符的比较

1348316-20190328222441935-2120454097.png

1348316-20190328223134696-709460477.png

1348316-20190328223202386-369788074.png

可以看出set集合查询效率跟数据规模无关!

set和线性结构

1348316-20190328222655184-307738589.png

集合

1348316-20190328222917522-1980676406.png

集合运算

1348316-20190329092120117-1521882622.png

1348316-20190329092624909-1182448255.png

1348316-20190329092923430-812160019.png

1348316-20190329093143846-2063441685.png

1348316-20190329093520587-1935871829.png

1348316-20190329094047980-628176046.png

解题思路:

1348316-20190329134858136-52809297.png

1348316-20190329134936054-77215051.png

1348316-20190329135002141-956486183.png

集合练习

1348316-20190329135122267-352288281.png

#利用集合来解决

1348316-20190329135317731-331302632.png

简单选择排序

1348316-20190329151807674-915726120.png

简单选择排序代码实现(一)

1348316-20190329152545836-98232140.png

简单选择排序代码实现(二)

1348316-20190329153134768-1370282425.png

#二元选择排序(降序)#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.如果使用了负索引来记录下标,则在比较判断时我们需要注意索引不能为负。

1348316-20190330093427064-769025555.png

简单选择排序总结

1348316-20190330094818900-599019257.png

字典dict

1348316-20190330095327911-1970657335.png

字典dict定义初始化

1348316-20190330100522662-580387086.png

#上述红色标记才是最为常用的初始化格式

1348316-20190330101453462-182951514.png

字典元素的访问

1348316-20190330100820911-895138695.png

字典的增加和修改

1348316-20190330102006229-1248529656.png

字典删除

1348316-20190330102336956-1002779660.png

1348316-20190330102741695-683135.png

字典遍历

1348316-20190330103253246-180399266.png

1348316-20190330104823472-1479160506.png

1348316-20190330104852718-1078447213.png

字典练习

1348316-20190330104948591-1061233965.png

waitting...

标准库datetime

1348316-20190330105705167-2031131994.png

1348316-20190330111025765-2052555472.png

1348316-20190330123250810-1159780175.png

1348316-20190330125003386-142769417.png

1348316-20190330125139251-402987304.png

1348316-20190330125837474-1258542930.png

1348316-20190330125850799-683594165.png

注意:total_seconds()是属于timedelta对象的方法!

标准库time

1348316-20190330130231466-2107203202.png

Python解析式、生成器

列表解析

1348316-20190330152121991-81596836.png

1348316-20190330151921855-1952282652.png

注意一下下列情况:

1348316-20190330151956601-683106513.png

1348316-20190330152506329-1457330339.png

1348316-20190330152815112-350091804.png

1348316-20190330152939177-579152697.png

列表解析进阶

1348316-20190330153735289-1606635069.png

1348316-20190330153804747-489263937.png

1348316-20190330153212793-191789982.png

1348316-20190330163553481-1994960096.png

输出都是[(5,24),(6,24)]

列表解析练习

1348316-20190330200938765-612119639.png

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)]

生成器表达式

1348316-20190331122512933-1291213413.png

1348316-20190331122841409-2063724709.png

1348316-20190331123313747-1300195215.png

结果会报异常:first和second都为None!

1348316-20190331123657341-1793322840.png

集合解析式

1348316-20190331124047703-1499253098.png

1348316-20190331124243410-602970063.png

字典解析式

1348316-20190331124756142-22109189.png

1348316-20190331124842461-408139924.png

总结

1348316-20190331124852848-188714909.png

内建函数

1348316-20190331125147367-404688858.png

1348316-20190331125720338-1743437500.png

1348316-20190331134939436-620260086.png

1348316-20190331135333101-1106691912.png

1348316-20190331135918073-1385393166.png

1348316-20190331140025812-542423736.png

1348316-20190331140821320-896407139.png

1348316-20190331141140013-1262909372.png

1348316-20190331141556096-933874253.png

可迭代对象

1348316-20190331141436022-728077472.png

迭代器

1348316-20190331141842975-440015404.png

迭代器不一定是生成器,但生成器本质是迭代器!

1348316-20190331142454146-757980468.png

字典练习

1348316-20190331152201377-1685662094.png

#按统计次数降序输出

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=" ")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值