python内置容器二

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)

你可能感兴趣的:(python,python,开发语言)