1.2.17.列表的查找
index()方法:用来查找某个元素在列表中第一次出现的位置(索引),若无该元素,会导致报错ValueError错误,所以应使用count()方法判断是否存在
格式:listname.index(obj,star,end)
listname:列表名
obj:查找的元素对象
star:起始索引
end:终止索引(不包含)
返回值:索引
list1=[40,36,89,2,36,100,7,-20.5,-999]
print(list1.index(2)) #查找数据2
print(list1.index(100,3,7)) #在[3,7)索引中查找100
print(list1.index(7,4)) #从4索引开始到结束查找数据7
print(list1.index(89,0,2)) #0索引到1索引查找89,未找到
例:有列表andy,内容包含名称和一系列的 比赛得分,计算他在第几场得分高
andy=['Andy',23,19,22,31,18,15]
print(andy)
scorce_max=max(andy[1:])
i=andy.index(scorce_max)
print(andy[0],'在第%d场得最高分%d'%(i,scorce_max))
使用in和not in查找列表元素
list1=[40,36,89,2,36]
print(2 in list1)
print(100 not in list1) #只能返回真和假
二分法查找(折半查找):要求必须是有序(默认是升序)序列,若为无序序列则应先排序。
list1=random.sample(range(0,20),20)
list1.sort()
print(list1)
n=int(input('请输入查找元素:'))
i=0
j=20-1
while i<=j:
mid=(i+j)//2 #计算中间数索引
if list1[mid]==n:
print('找到了')
break
else:
if nj:
print('没找到')
1.2.18.列表逆置(颠倒顺序)
格式:listname.reverse()
例:
import random
list1=random.sample(range(0,20),20)
print(list1)
list1.reverse()
print(list1)
注意:永久性的改变,若需要使用原始数据则只需再执行一次
1.2.19.列表的元素组合
作用:将列表的元素组成一个字符串
格式:char.jion(sep)
char:组合后元素的分割符
seq:表示处理的对象,必须为列表,元组等序列数据
例:
char='-'
list1=['silicon','stone','education']
print(char.join(list1))
print('=='.join(list1))
print('\n'.join(list1))
1.2.20.列表的浅拷贝与深拷贝
列表之间的赋值
list1=[1,2,3,4]
list2=list1
print(id(list),id(list2))
for i in range(len(list1)):
list1[i]+=1 #list1中所有元素值加1
print(list1)
print(list2)
分析:列表的赋值相当于取别名,即两者都指向同一个堆栈区的地址列表对象,操作任意一个,另一个同步发生变化
list1=[1,2,3,4]
list2=list1.copy() #list2是list1的浅拷贝结果
print(id(list),id(list2))
for i in range(len(list1)):
list1[i]+=1 #list1中所有元素值加1
print(list1)
print(list2)
分析:list2是list1列表的浅拷贝,id与list1不同,这是因为通过浅拷贝,产生的一段新的内存地址空间,与list2绑定,虽然内容相同但地址不同,相互隔离,互补影响,但列表中出现可变类型时则浅拷贝无效,如:
list1=[1,2,[3,4]]
list2=list1.copy() #list2是list1的浅拷贝结果
print(id(list),id(list2))
list1[0]+=1
list1[1]+=1
list1[2][0]+=1
list1[2][1]+=1
print(list1)
print(list2)
print(id(list1[2]),id(list2[2]))
分析:list1列表两个不可变元素1和2没有改变并没有影响list2,但list1的可变类型元素[3,4]改为[4,5]list2列表中的字列表页一同改变,说明list1和list2并没有完全隔离开来,虽然list1和list2的内存地址互相独立,但列表第三项绑定的是同一个子列表地址,如果原列表包含了可变类型元素,通过浅拷贝得到新列表,不能实现与原列表完全隔离,若要完全隔离需要使用深拷贝
分析:通过深拷贝,子列表完全隔离,从而实现了与列表真正的完全区分隔离
import copy
list1=[1,2,[3,4]]
list2=copy.deepcopy(list1) #list2是list1的浅拷贝结果
print(id(list),id(list2))
list1[0]+=1
list1[1]+=1
list1[2][0]+=1
list1[2][1]+=1
print(list1)
print(list2)
print(id(list1[2]),id(list2[2]))
1.2.21.列表的推导式
作用:可以使用推导式生成新列表
格式:listname=[表达式,for 循环变量in range()]
例:创建数值为0-19的列表
list1=[x for x in range(20)]
print(list1)
相当于:
list1=[]
for x in range(20):
list1.append(x)
print(list1)
例2:创建100-200间30个30个数的随机数列表
import random
list1=[random.randint(100,200) for i in range(30)]
print(list1)
ranint(x,y)表示产生一个随机数,范围在x在y之间
根据旧列表生成指定新列表
newlistname=[表达式,for 循环变量 in 就旧列表]
例:根据原列表生成数值折半列表
import random
list1=[random.randint(0,100) for i in range(20)]
print(list1)
list2=[x/2 for x in list1]
print(list2)
从旧列表中选择符合条件的组成新列表
格式:newlistname=[表达式,for循环变量 in 旧列表名 if 条件表达式]
例:创建1-10之间的偶数列表
import random
list1=[random.randint(0,10) for i in range(10)]
print(list1)
list2=[x for x in list1 if x%2==0]
print(list2)
注意:
只用列表推导式来创建新列表,并且尽可能保持简短
如果列表推导式的代码超过了2行,则代码可读性大大降低,应考虑写成循环
1.2.22.程序实例
例1:将20个:十进制整数存储到列表xx中,计算xx列表的奇数平均值,偶数平均数值,偶数的方差
list1 = random.sample(range(10, 100), 20)
print('随机存储的整数为', list1)
list2 = []
x = 0
y = 0
sum1 = 0
sum2 = 0
sum3 = 0
for i in range(20):
if int(list1[i]) % 2 == 0:
sum2 += list1[i]
x = x + 1
list2.append(list1[i])
else:
sum1 += list1[i]
y = y + 1
ave2 = sum2 / x
ave1 = sum1 / y
for j in range(x):
sum3 = (list2[j] - ave2) ** 2 + sum3
totfc = sum3 / x
print('奇数的平均值为:%.2f' % ave1, '偶数的平均值为:%.2f' % ave2, '偶数的方差为:%.2f' % totfc)
import numpy
import random
xx = random.sample(range(0, 30), 20)
ave1 = [i for i in xx if i % 2 == 1]
ave2 = [i for i in xx if i % 2 == 0]
print('奇数平均值:', numpy.mean(ave1))
print('偶数平均值:', numpy.mean(ave2))
print('偶数方差:', numpy.var(ave2))
例2:将输入的一行空格作为分隔符的数字去重后输出
#2 2 2 3 4 5 6 4 3 2
#split():将空格分隔符的字符串切片后转为字符串列表
list1=input('请输入空格分隔的数字内容:').split()
for i in range(len(list1)):
list1[i]=int(list1[i])
print(list1)
list2=[]
for i in list1:
if list2.count(i)==0:
list2.append(i)
print(list2)