⼀⽂搞懂Python中的所有数组数据类型
数组类型是各种编程语⾔中基本的数组结构了,本⽂来盘点下Python中各种“数组”类型的实现。
list
tuple
array.array
str
bytes
bytearray
其实把以上类型都说成是数组是不准确的。这⾥把数组当作⼀个⼴义的概念,即把列表、序列、数组都当作array-like数据类型来理解。数组指针 指针数组
注意本⽂所有代码都是在Python3.7中跑的
1.可变的动态列表list
list应该是Python最常⽤到的数组类型了。它的特点是可变的、能动态扩容,可存储Python中的⼀切对象,使⽤时不⽤指定存储的元素的类型。
使⽤⾮常简单
>>> arr =["one","two","three"]
>>> arr[0]
'one'
# 动态扩容
>>> arr.append(4)
>>> arr
['one','two','three',4]
# 删除⼀个元素
>>>del arr[2]
>>> arr
['one','two',4]
2. 不可变的tuple
tuple的操作与list类似。它的特点是不可变,不能扩容,可存储Python中的⼀切对象,使⽤时不⽤指定存储的元素的类型。
>>> t ='one','two',3
>>> t
('one','two',3)
>>> t.append(4)
AttributeError:'tuple'object has no attribute 'append'
>>>del t[0]
TypeError:'tuple'object doesn't support item deletion
登录代码是什么tuple可以使⽤+运算符,这个运算将创建⼀个新的tuple对象⽤于存储数据。
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:778463939
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
>>> t+(1,)
('one','two',3,1)
>>> tcopy = t+(1,)
>>> tcopy
('one','two',3,1)
>>>id(tcopy)
4604415336
>>>id(t)
4605245696
可以看出tuple执⾏+运算符之后两个对象的地址是不⼀样
3.array.array
如果在Python中要⽤到其它语⾔中类似“数组”的数据结构,就需要⽤到array模块了。它的特点是可变的、存储相同类型的数值,不能存储对象。
因为array在使⽤的时候要指定元素数据类型,因此它⽐list和tuple都有⽐较⾼效空间性能。
# 使⽤时指定元素数据类型为`float`
>>> arr = array.array('f',(1.0,1.5,2.0,2.5))
>>> arr
array('f',[1.0,1.5,2.0,2.5])
# 修改⼀个元素
>>> arr[1]=12.45
>>> arr
培训班招生海报array('f',[1.0,12.449999809265137,2.0,2.5])
# 删除⼀个元素
>>>del arr[2]
>>> arr
array('f',[1.0,12.449999809265137,2.5])
# 增加⼀个元素
>>> arr.append(4.89)
>>> arr
array('f',[1.0,12.449999809265137,2.5,4.889999866485596])
# 如果将⼀个字符串类型数据存储到⼀个浮点数的数组将会报错
>>> arr[0]='hello'
TypeError: must be real number,not str
怎么把文件改成json格式array中元素的数据类型可以参考下表
4.字符串序列str
Python3中使⽤str对象来表⽰⼀个⽂本字符序列(看,这跟Java中的字符串String是多么相似呢)。它的特点不可变的Unicode字符序列。
python基础教程pdf电子书在str中它的每⼀个元素都是字符串对象。
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:778463939
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
>>> s ='123abc'
>>> s
'123abc'
>>> s[0]
'1'
>>> s[2]
'3'
# 字符串是不可变的序列,不能删除其中的元素
>>>del s[1]
TypeError:'str'object doesn't support item deletion
# 要对字符串进⾏操作,可以转化成list
>>> sn =list(s)
>>> sn
['1','2','3','a','b','c']
>>> sn.append(9)
>>> sn
['1','2','3','a','b','c',9]
# 字符串中的元素也是字符串对象
>>>type(s[2])
<class'str'>
>>>type(s)
<class'str'>
str对象也可以执⾏+操作,它也会⽣成⼀个新对象⽤于存储。
>>> s2 = s+'33'
>>> s2
'123abc33'
>>>id(s2)
4605193648
>>>id(s)
4552640416
5.bytes
二郎神之深海蛟龙2021版
bytes对象⽤于存储字节序列,它的特点是不可变存储,可存储0-256的数值。
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:778463939
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
>>> b =bytes([0,2,4,8])
>>> b[2]
4
>>> b
b'\x00\x02\x04\x08'
>>> b[0]=33
TypeError:'bytes'object does not support item assignment
>>>del b[0]
TypeError:'bytes'object doesn't support item deletion
6.bytearray
bytearray对象与bytes类似,⽤于存储字节序列。它的特点是可变的,能动态扩容的字节数组。
>>> ba =bytearray((1,3,5,7,9))
>>> ba
bytearray(b'\x01\x03\x05\x07\t')
>>> ba[1]
3
# 删除⼀个元素
>>>del ba[1]
>>> ba
bytearray(b'\x01\x05\x07\t')
>>> ba[0]=2
>>> ba[0]
2
# 添加⼀个元素
>>> ba.append(6)
# 只能添加字节
>>> ba.append(s)
TypeError:'str'object cannot be interpreted as an integer
>>> ba
bytearray(b'\x02\x05\x07\t\x06')
# 字节的范围是0-256
>>> ba[2]=288
ValueError: byte must be in range(0,256)
bytearray可以转化成bytes对象,但效率不是很⾼。
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:778463939
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
# bytearray转成bytes将⽣成⼀个新对象
>>> bn =bytes(ba)
>>>id(bn)
4604114344
>>>id(ba)
4552473544
7. 各个类型相互转化
tuple->list
>>>tuple(l)
('a','b','c')
list->tuple
>>> t
('a','b','c')
>>>list(t)
['a','b','c']
str->list
>>> l =list('abc')
>>> l
['a','b','c']
list->str
>>> l
['a','b','c']
>>>''.join(l)
'abc'
str->bytes
'''
遇到问题没⼈解答?⼩编创建了⼀个Python学习交流QQ:778463939
寻有志同道合的⼩伙伴,互帮互助,⾥还有不错的视频学习教程和PDF电⼦书!
'''
>>> s ='123'
>>>bytes(s)
TypeError: string argument without an encoding
>>>bytes(s,encoding='utf-8')
b'123'
# 或者使⽤str的encode()⽅法
>>> s.encode()
b'123'
bytes->str
>>> b = b'124'
>>> b
b'124'
>>>type(b)
<class'bytes'>
>>>str(b,encoding='utf-8')
'124'
# 或使⽤bytes的decode()
>>> b.decode()
'124'
8. 总结
这些数据类型都是Python⾃带的,在实际开发中应该根据具体需求选择合适的数据类型。例如当要存储的元素类型是多种多样的,那么就应该使⽤list或者tuple。⽽array.array相对来说拥有较好的空间性能,但它只能存储单⼀类型。
我相信在很多业务场景中list或tuple是可以满⾜需求的,只是其它数据结构也要有所了解,在我们做⼀些基础组件时,会考虑数据结构的性能,或者阅读他⼈的代码时,能做到⼼中有数。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论