详解python的四种内置数据结构

对于每种编程语言一般都会规定一些容器来保存某些数据,就像java的集合和数组一样python也同样有这样的结构

而对于python他有四个这样的内置容器来存储数据,他们都是python语言的一部分可以直接使用而无需额外的导入

一.列表(list)

列表一种跟java和c中的数据很像的一种数据结构,他都是保存一系列相似,且有序元素的集合,不过不同的是列表中的元素可以不是同一种数据类型,且列表的长度是可变的

可以动态的增加可减少这一点则有点像java中的stringBuilder对象,列表中有一点值得注意的是在对列表进行复制是,不能简单的使用赋值语句,这样会使得两个变量同时指向一个列表,当一个改变时另一个变量的值也会改变,正确的复制方法是用copy()方法来进行复制

关于一个存储结构增删查看则其必备的功能:

1.列表元素的增加

  1. append的方法是将所要加的元素直接加到先前列表的末尾的方法,在增加的同时还会使得列表得长度增加
  2. extend方法是将一个列表中得所有元素加拓展到另一个列表的末尾将两个列表合并为一个列表
  3. insert方法是将一个元素插入到指定的位置,但是值得注意的是insert方法不能插到列表的末尾

2.列表元素的删除

  1. remove删除列表中指定的值,如果列表中没有remove参数中指定的值解释器将会报错
  2. pop删除指定索引位置对应的对象,如果pop方法中没有参数是则其默认的是删除列表的最后的一个对象,该方法的返回值就是对应删除的对象,若其指定的索不存在      时解释器同样会报错

下面通过一个简单的例子来说明以上方法的使用:

#在 Don't panic变为 on tap
phrase="Don't panic"

plist=list(phrase) #将phrase表示的字符串转化为列表


print(phrase)    #将该字符串输出
print(plist)    #结果为['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c']

plist.remove("'")  #将‘在列表中删除

for i in range(3):
  plist.pop()   #将列表末尾的3个字符给删除,'n','i','c'

plist.pop(0)    #将plist中索引对应的对象删除,也就是D

#此时list中的值为['o', 'n', 't', ' ', 'p', 'a']

plist.extend([plist.pop(5),plist.pop(4)]) #将p和a的位置交换

plist.insert(2,plist.pop(3)) #将空格插入到对应索引为2的对象前

phrase =''.join(plist) #将列表转化为字符串

print(phrase)

3.列表元素的查看:

值得说明的是列表的查看和数组相似,都支持下标查看不过不同的是列表的查看功能比数组更多

  1. a.中括号加下标可以查看列表中的任意元素且元素的下标也都是从0开始的,这点与数组相同,但不同的是数组中的下标不能为负数,而列表可以其表示的是从右到左,而正数则是从左到右
  2. b.列表中支持切片查看,也就是查看某一段元素其用法为:list[开始位置:结束位置:步长]其中所有元素都可以省,只需要在括号中有一个元素即可例如:
  3. list[: :2]表示开始为0,结束为列表尾,步长为2

下面我们任然以一段简单的代码来展示其用法:

#在 Don't panic变为 on tap
phrase="Don't panic"

plist=list(phrase)
new_phase=''.join(plist[1:3])#在列表中截取on
print(new_phase)
new_phase=new_phase+''.join([plist[5],plist[4],plist[7],plist[6]])


#切片的实例,以及负数

plist[-1] # c

temp =plist[5:1:-1] #[' ', 't', "'", 'n']当步长为负数时其结果时从右到左遍历
temp2=plist[::2]#['D', 'n', 't', 'p', 'n', 'c'],从头遍历到尾步长为2

事实上对于存储类似对象的时候我们一般是使用列表,而对于那种有结构的数据是列表就显得不那么实用了因为列表很难存储数据之间的结构

所以对于那种结构化的数据我们一般采用字典来存储

二.字典(dict)

字典使用来保存一个键值对集合,其中每个唯一的键都有一个与之对应的值,通常我们把字典称为关联数组,如果你学过java的那么对字典就不会陌生了因为它其实就是java中的set集合,python的字典是无序的它不会保留你插入时的顺序,同时由于字典使用的是一种高度优化的散列算法所以即使是没有顺序字典一样能快速的访问与一个键相关的值

1字典的定义:

其结构为{键1:值1,键2:值2},可以看出字典的开始和结束都是用大括号键和值用冒号隔开,不同键值对之间用逗号分隔,其中值可以为列表,另一个字典

2字典的增加:

字典时一个动态的集合他可以在键对不存在时插入新的键值对,但是字典中键必须进行初始化后才可以引用例如:在一个商店中你不知到你的商店中的苹果又没有时
你不可以直接的使用苹果这个值而当你像添加时也需要查明商店中是否有这样物品,对于字典则无需这样。因为字典已经分装好了一个setdefault()方法只需直接调用即可

下面用一段简单代码展示:

#字典的添加键值对
fruit={}
#当直接使用不存在的键值对时

fruit['apple']+=1 #没有对该键初始化而直接使用会出现keyError

#当不使用setdefault方法时动态的增加键值对
if 'apple' not in fruit:
  fruit['apple']=0 #初始化键值
fruit['apple']+=1 #增加苹果的量
print(fruit['apple'])

#使用setdefault时,其实就是设置一个默认值,确保使用时这个使用的键存在即可

fruit.setdefault('apple',0)#当键存在时这个语句没有任何作用,相当于上面选择的分装
fruit['apple']+=1
print(fruit['apple'])

3字典的遍历:

对于一个集合来说我们一般都会采用集合来遍历其中的所有元素但是对于字典来说单单只用循环的话并不够方便因为仅仅只用循环的话解释器只会处理字典的键
对于其值任然需要用键来查值,对于这种问题python提供了一个items()的方法使得可以直接使用循环变量来访问字典的键和值

下面通过一段简单的代码说明:

fruit={'apple':10,'pears':5,'bananas':20,'orange':4}
#直接使用for循环遍历
for i in fruit:
  print("种类",i,"数量",fruit[i])
#使用items方法遍历
for i,v in fruit.items():
  print("种类",i,"数量",v)

4字典的元素删除:

python的字典删除有三种方法,一种是clear()是删除字典中的所有元素,二是pop()根据pop中的参数删除与其键相同的键值对,三是popitem()随机删除字典中的元素
对于有结构的数据我们使用字典时会显得非常方便,因为他不仅可以保存结构,还可以保证记录不重复,但是对于那些没有结构的数据我们又不希望他们重复时,字典和列表显然都不适合我们使用了,这时我们就会想到使用集合了

三.集合(set)

1集合的定义:

{元素1,元素2,元素3.....}和字典一样都是用大括号定义,不过不同的是其中没有冒号分割,还有一种定义方法是向set()函数中传递任意一个序列(如一个字符串set('fsdaf'))

2集合的运算:

python中的集合同于数学中的集合同样有交,并,差等运算其中并算提供方法union(),差集方法difference()不过这里不同的是只能显示使用该方法的集合中不同于另一个集合的所有元素,交集的方法intersection()显示相同的元素

下面用代码来实现上述方法:

#集合的运算
temp={'a','e','i','o','u'}
temp2=set("fda");

#交运算
result=temp.intersection(temp2)#{'a'}

#并运算
result=temp.union(temp2)#{'a', 'o', 'f', 'd', 'u', 'e', 'i'}

#差运算
result=temp.difference(temp2)#{'o', 'e', 'u', 'i'}

我们知道变量有两种一种是变量一种是常量,变量的值可以重新赋予,而常量的值则不行,在python中我们同样有一个不变的结构叫做元组

四.元组(tuple)

1元组的定义:

元组与列表密切相关列表是用中括号定义而元组则是用小括号定义(元素1,元素2,元素3,.....),值得注意的是当只有一个对象是并不能仅仅(对象)这样定义并不是元组,正确的定义方法是(对象,)这样才是元组

在最后我有必要说明一下:在这四个内置结构为空时的解释器的表示方法:1.空列表[] 2.空字典{} 3.空集合set() 4.空元组()