(原创作者:陈玓玏)
如果不自己去实现几个复杂点的算法,还真发现不了这几个数据结构到底有什么好处。先简单说一下好处,到后面再说一下这几种数据结构增删查改遍历的用法吧。
一、三种数据结构适用场景
1、列表 的好处在于很好遍历,有顺序,而且允许重复对象的存在,一般如果只是用来存储一下for循环这类的语句产生的序列型的结果,我会选择用列表来存储,因为它顺序固定,方便访问,结构简单。
2、字典 的好处在于可以各种嵌套,比如字典可以无穷嵌套字典,也可以无穷嵌套列表,并且不同于列表,字典可以在key和value中存入成对的信息,虽然列表也可以这么嵌套,但是对于成对的信息就不好提取了。基本上字典非常好用,存什么信息都很棒,取也很方便,重点是非常适合各种类型的数据存储需求。但是字典有两个坏处,一是无序,虽然Python中默认存储为有序了,但是按照索引来遍历风险还是很大的,不能保证取到想要的结果;二是字典的key不能重复。
3、集合 的好处在于,集合可以快速地帮你筛选出唯一值,也就是说用集合来去重非常方便,讲个比较有代表性的用法就是FP树中计算频繁项和头指针的时候,把列表转换成集合能够轻松地把数据转换成适合求解频繁项集的格式。另外集合和字典一样,可以嵌套很多数据结构,包括列表、字典等。最大的好处是判断交集、并集、差集时非常方便,比如核查两种算法计算结果是否一致时,用集合就很好判断了。集合的坏处是用的场景比较少,暂时只想到了这个。
下面上代码,讲这三种数据结构的增删查改和遍历。
二 、列表增删查改排序筛选及遍历
listA = [1,2,3,4,5]
listA.append(6) #增加元素,参数为要增加的元素内容
listA.pop(5) #删除元素,参数为要删除的元素索引
print(listA[2]) #查找元素,参数为要元素索引
listA[2] = 10 #修改元素,参数为元素索引
for i in listA: #遍历列表
print(i)
print('排序后的list',sorted(listA)) #列表排序
print([v for v in listA if v>3]) #使用列表推导式实现列表筛选
print([listA.index(v) for v in listA if v>3]) #使用列表推导式实现列表筛选,并输出对应索引,这个index方法只有list对象有
三 、字典增删查改排序筛选及遍历
dictA = {'a':1,'b':2,'c':3,'d':4,'e':5,'f':6}
dictA['g'] = 7 #新增字典元素,也可以用来修改字典元素
del dictA['a'] #根据key删除键值对
print(dictA['b']) #根据key查找对应的value
print(dictA.get('a',0)) #根据key查找对应的value,如果key不存在则返回第二个参数为默认值
print([v[0] for v in dictA.items() if v[1]==5]) #根据value找到对应的key,根据value进行筛选也可以用这个方法
for i in dictA.keys(): #遍历字典的value
print(dictA[i])
for i in dictA.keys(): #遍历字典的keys
print(i)
for i in dictA: #另一种更直接的遍历keys的方法
print(i)
for i in dictA.items(): #以元组形式返回键值对,第一个值为key值,第二值为value.如果不是遍历,那么所有的键值对元组以列表形式一起返回
print(i)
print(sorted(dictA.items(),key=(lambda x:x[1]),reverse=True)) #获取键值对为元组,使用lambda函数取出每个元组中的value值,根据value进行降序排列
print(sorted(dictA.items(),key=(lambda x:x[0]),reverse=False)) #获取键值对为元组,根据key进行升序排列,注意key=和reverse=这两个关键字必须写明
四 、集合增删查改排序筛选及遍历
setA = {'a','b','c','d','f','f'}
print(setA) #结果为{'c', 'b', 'f', 'a', 'd'},因为set只会保留不重复数据,且是无序的
setA.add('g') #添加元素
setA.update('h') #添加元素的另一种方法
#setA.pop() #可以删除元素,但是不接受任何参数,且set排列无序,所以很难说删掉的是哪个数,不建议使用
#setA.remove('g') #删除特定元素还是用这个比较好,但是因为是无序的,所以无法根据索引删除
print([v for v in setA]) #因为set没有索引、没有key,所以不能取单个值,也不能改单个值,也没这个必要。但是可以遍历,使用这种方法也可以做筛选
print(sorted(setA)) #set的排序
五 、frozenset增删查改排序筛选及遍历
frozenset是集合的一种,和set一样,无序无索引,但是set可改变,而frozenset不可。也就是说,frozenset对象没有add、remove、update这些方法。集合主要是使用时可以方便地判断交集、并集、差集等,这些功能上set和frozenset是一致的。
fsetA = frozenset({'a','b','c','d','f','f'})
fsetB = frozenset(['a','b','g','h'])
print(fsetA,fsetB) #可以查看一下frozenset的输出结果,和set有什么不同,其实但看输出结果,没什么不同,只是frozenset没有增删改等功能
print(fsetA.difference(fsetB)) #取存在于fsetA中但不存在于fsetB中的值
print(fsetA-fsetB) #同上
print(fsetA.symmetric_difference(fsetB)) #取未同时出现在两个集合中的值
print(fsetA.intersection(fsetB)) #取集合交集
print(fsetA&fsetB) #同上
print(fsetA.union(fsetB)) #取两个集合并集
print(fsetA|fsetB) #同上
print(fsetA.isdisjoint(fsetB)) #判断fsetA是否是fsetB有交集,如果没有则返回true
print(fsetA.issubset(fsetB)) #判断fsetA是否是fsetB的子集
print(fsetA.issuperset(fsetB)) #判断fsetA是否是fsetB的超集