Python3 数据结构
一、列表(https://blog.csdn.net/Lucis_tomato/article/details/115898462)
python中列表时可变的,这是它区别于字符串和元组的最重要特点(list可以修改,string及tuple不可改)
list方法 方法 描述 list.appedn(x) 添加一个元素到list结尾,等同于a[len(a):]=[x] list.extend(L) 通过添加指定列表的所有元素来扩充列表,相当于a[len(a):]=L list.insert(i,x) 在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素索引,例如a.insert(0,x) 会插入到整个列表之前,而a.insert(len(a),x) 相当于a.append(x) list.remove(x) 删除列表中值为x的第一个元素。如果没有这样的元素,就会返回一个错误。 list.pop([i]) 从列表的指定位置移除元素,并将其返回。如果没有指定索引,a.pop()返回最后一个元素。元素随即从列表中被移除 list.clear() 移除列表中所有的项,等于del a[:] list.index(x) 返回列表中第一个值为x的元素索引。如果没有匹配项就会返回一个错误。 list.count(x) 返回x在列表中出现的次数。 list.sort() 对列表中的元素进行排序。 list.reverse() 倒排列表中的元素。 list.copy() 返回列表的浅复制,等于a[:]
二、将列表当当做堆栈使用(后进先出)
列表方法使得列表可以很方便的作为一个堆栈来使用,堆栈作为特定的数据结构,最先进入的元素最后一个被释放(后进先出)。
用append()方法可以把一个元素添加到堆栈顶。
用不指定索引的pop()方法可以把一个元素从堆栈顶释放出来。
#!/usr/bin/python3 #将列表当堆栈使用 stack = [3,4,5] print(stack) stack.append(6) stack.append(7) print(stack) stack.pop() print(stack) stack.pop() print(stack) stack.pop() print(stack)
三、将列表当做队列使用(先进先出)
也可以把列表当做队列使用,只是在队列里第一加入的元素,第一个取出来;
但是拿列表用作这样的目的效率不高。
在列表的最后添加或者弹出元素速度快,然而在列表里插入或者头部弹出速度却不快(因为所有其他元素都得一个一个地移动)
#!/usr/bin/python3 from collections import deque queue = deque(["Eric","John","Michael"]) print(queue) queue.appendleft(2) print(queue) queue.append(2) print(queue) queue.popleft() print(queue) queue.popleft() print(queue)
四、列表推导式
列表推导式提供了序列创建列表的简单途径。
通常应用程序将一些操作应用于某个序列的每个元素,用其获得的结果作为生成新列表元素,或者根据确定的判断条件创建子序列。
每个列表推导式都在for之后跟一个表达式,然后有零到多个for或if子句。
返回结果是一个根据表达从 其后的for和if上下文环境中生成出来的列表。
如果希望表达式推导出一个元组,就必须使用括号。
#!/usr/bin/python3 test =[1,2,3,4] vote = [3*x for x in test] print(vote) vote1 = [[x,x**3] for x in test] print(vote1)
#!/usr/bin/python3 freshfruit = ['banana','orange','starwberry','cherry'] result = [w.strip() for w in freshfruit] print(result) result2 = [3*w for w in freshfruit if w != 'starwberry'] print(result2) num1 = [1,3,5,6] num2 = [2,4,8,0] result3 = [x*y for x in num1 for y in num2] print(result3) num3 = int(input("输入一个数字")) num4 = int(input("再输入一个数字")) print(num3,'/',num4,'分别保留1-4位小数是:',[str(round(num3/num4,i)) for i in range(1,5)])
五、嵌套列表解析
python的列表还可以嵌套。
#!/usr/bin/python3 #尝试做个矩阵 cube = [ [1,2,3,4], [2,2,3,4], [3,2,3,4], [4,2,3,4] ] print(cube) result1 = [[row[i] for row in cube] for i in range(4)] print(result1) result2 = [] for i in range(4): result2.append([row[i] for row in cube])
另一种解决方案
#!/usr/bin/python3 #另一种实现方法 cube = [ [1,2,3,4], [2,2,3,4], [3,2,3,4], [4,2,3,4] ] print(cube) another = [] for i in range(4): another.append([row[i] for row in cube]) print(another)
![]()
六、del语句
使用del语句可以从一个列表中依索引而不是值来删除一个元素。
这与使用pop()返回一个值不同。
可以用del语句从列表中删除一个切割,或清空整个列表(我们以前介绍的方法是给该切割赋一个空列表)
#!/bin/usr/python3 list1 = [1,2,3,4,5,6,'s'] del list1[-1] print(list1) del list1[2:4] print(list1) del list1[:] print(list1)
七、元组和序列
元组由若干逗号分隔的值组成,
#!/usr/bin/python3 tuple1 = 1,2,3,4,5,6 tuple2 = ('a','b','c','d','e','f','g','h','i') print(type(tuple1),type(tuple2)) print(tuple1[2]) tuple3 = tuple1,(22,33,44,55) print(type(tuple3),tuple3)
八,集合
集合是一个无序不重复元素的集。
基本功能包括关系测试和消除重复元素。
可以用大括号{}创建集合。
创建一个空集合,你必须使用set()创建空集合而不是{};{表示一个空字典}
#!/usr/bin/python3 basket = ('apple','orange','apple','pear','orange','banana') print('type(basket)',type(basket),':',basket) setb = set(basket) print('type(setb)',type(setb),':',setb) print('apple in setb is','apple' in setb) print('bobby in setb is','bobby' in setb) #集合操作 a = {'日','俄','法','英','美','意','德','奥','意','德','奥'} b = {'英','加','美','新','美','澳','加','美'} #证明集合去重 print('a=',a) print('b=',b) #在a 不在b print('a-b:',a - b) #在a或b中 print('a|b:',a|b) #a和b均有 print('a&b:',a&b) #不同时在a或b print('a^b',a^b) #集合推倒式 b = {x for x in a if x not in '俄'} print(b)
九、字典
另一个非常有用的python内建数据类型是字典。
序列是以连续的整数位索引,与此不同的是,字典以关键字为索引, 关键字可以是任意不可变类型,通常字符串或数值。
字典是 无序“键与值”对的集合。
字典中的键唯一。
#!/usr/bin/python3 import math BeTerminated = {'Qin':'BC-207','Han':'BC-230','Zhao':'BC-222','Wei':'BC-225','Chu':'BC-224','Yan':'BC-222'} print('秦灭亡及同一顺序:',BeTerminated) BeTerminated[input('所缺少的国家:')] = input('所缺少的国家哪一年被灭:') #BeTerminated[input('Qi')] = input('BC-221') #BeTerminated['Qi'] = 'BC-221' print('你给出的结果:',BeTerminated) print(len(BeTerminated)) #确定正确的规则 x = ['Qin','Han','Zhao','Wei','Chu','Yan','Qi'] #对目标list进行排序 x.sort(reverse=True) Fbe = (sorted(BeTerminated.keys())) Fbe.sort(reverse=True) #判断灭亡是否不等于7 if len(BeTerminated) != 7: print('check the set,重新学习') elif len(BeTerminated) == 7: if x != Fbe: print('回去重学吧') elif x == Fbe: if BeTerminated['Qi']=='BC-221': print('继续进行') elif BeTerminated['Qi']!='BC-221': print('还是回去重学吧') else : print('error') #调试试用语句 print('---------------------------------------------------') print('---------------------------------------------------') print('---------------------------------------------------') print('---------------------------------------------------') print(type(sorted(BeTerminated.keys()))) print(x,',and,',sorted(BeTerminated.keys())) print(x not in sorted(BeTerminated.keys())) print(x in sorted(BeTerminated.keys())) print(x != sorted(BeTerminated.keys())) print('Qin灭亡于:',BeTerminated['Qin']) print(x) print(Fbe) #2021年5月17日16:57:24 最终确定sorted(BeTerminated.keys()) 为list 类型 明日采用list判断等值的方式处理当前问题
ps:若想list1中元素是否与字典元素相等,可使用 sorted(集合名.keys()) 筛出key元素的list2列表,再将两list进行同规则(正序或倒序排序)处理后进行判断,该方式仅适用于去重处理的list中。
如上方式采用set()转换使用或许更好。
构造函数dict()直接从键值对元组列表中构建字典。如果有固定模式,列表推导式指定特定的键值对:
#!/usr/bin/python3 x = [('Qin','BC-207'),('Han','BC-230'),('Zhao','BC-222'),('Wei','BC-225'),('Chu','BC-224'),('Yan','BC-222')] f = dict(x) print(f)
字典推导可以用来创建任意键值的表达式词典:
#!/usr/bin/python3 x = {a : a**3 for a in (1,3,4,5)} print(x)
如果关键字只是简单的字符串,使用关键字指定键值也可以。
#!/usr/bin/python3 t = dict(baoby=250,ergou=500,tongziji=1000) print(t)
十、遍历技巧
10.1在字典中遍历时,关键字和对应的值可以使用items()方法同时解读出来:
#!/usr/bin/python3 BeTerminated = {'Qin':'BC-207','Han':'BC-230','Zhao':'BC-222','Wei':'BC-225','Chu':'BC-224','Yan':'BC-222'} for k , v in BeTerminated.items(): print(k,v)
10.2 在序列(list)中遍历时,索引位置和对应值可以使用 enumerate()
#!/usr/bin/python3 list1 = [1,2,3,4,5] for k , v in enumerate(list1): print(k,v)
10.3 同时遍历两个或更多的序列,可以使用zip()组合:
#!/usr/bin/python3 a = ['name','sex','weight'] b = ['Lux','M','50kg'] for a , b in zip(a,b): print('What is your {0} ? It is {1}.'.format(a,b))
10.4 反向遍历一个序列,首先指定这个序列,然后调用 reverse()函数:
#!/usr/bin/python3 BeTerminated = ['Han','Zhao','Wei','Chu','Yan','Qi','Qin'] for i in reversed(BeTerminated): print(i)
10.5 要按顺序遍历一个序列,使用sorted()函数 返回一个已排序的序列,并不修改原值:
#!/usr/bin/python3 BeTerminated = ['Han','Zhao','Wei','Chu','Yan','Qi','Qin'] for i in sorted(BeTerminated): print(i)