python学习之列表

我爱海鲸 2023-04-02 17:57:54 python、python学习

简介python基础、py、解释型语言、列表

循环和列表

一、列表

在python中,有这样一些类型,它们的成员是有序排列的,并且可以通过下标访问成员,这些类型称之为序列,包括:列表、range、元组和字符串;其中列表的成员可修改,属于可变序列,字符串和元组,成员不可修改,属于不可变序列。序列有共同操作:

  • 成员关系运算(in,not in)

  • 连接操作(+)

  • 重复操作(*)

  • 切片操作([::])

1 概述

引出:存储一个数据可以采用变量

问题:需要同时存储多个数据,该怎么做?

#需求:有5个人的年龄,求平均年龄
age1 = 10
age2 = 32
age3 = 43
age4 = 18
age5 = 90
average = (age1 + age2 + age3 + age4 + age5) / 5

解决:容器【Python提供了一种数据结构list,可以同时存储多个数据】

本质:一种有序的集合

2 创建列表

语法:列表名 = [列表选项一,列表选项二,列表选项三.....]

说明:使用[]表示列表,列表名其实就是标识符

将列表中的列表选项被称为元素

列表中的元素分别被编了号,这些编号被称为索引【下标,角标】

列表索引:

从左向右开始编号:0,1,2....n-1

从右向左编号: -1,-2......

-7 -6 -5 -4 -3 -2 -1

[10 , 20 , 30 , 40, 50 ,90, 80]

0 1 2 3 4 5 6

list1 = []  #创建一个空列表
list2 = [10,9,True,'张三']
list3 = list()  #创建一个空列表
list4 = list('hello world)  # ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']

3.列表中元素的访问

列表中元素不能整体访问,只能单个存取

3.1取值

语法:列表名[索引]

list1 = [1,2,4,3,8]
num = list1[2]
print(num)

#下标越界,引发IndexError, 需要自己确定不要越界
print(list1[5])

3.2 修改

语法:列表名[索引] = 新的元素值

list1[2] = 888
print(list1)

3.3 遍历

列表的遍历就是访问列表的每一个元素,可以使用while循环和for-in循环。经常使用for-in循环遍历列表

for-in语法:

for 变量名 in 列表:
     语句A
else:
      语句B

说明:主要用于遍历序列【遍历:依次访问序列中的每一个元素,获取元素值】

工作原理:按照顺序获取列表中的每个元素,赋值给变量,再执行语句A,以此类推,直到列表中的元素全部获取为止,循环终止后执行else语句块。

不要在for-in循环中添加或删除元素

#只能获取元素,不能得到元素的下标
for value in list1:
	print(value,end=' ')
	
#index表示下标,num表示元素值
#enumerate将列表变成一个索引序列,同时包含下标和数据
for index,num in enumerate(list1):
    print(index,num)
#二维列表的遍历,循环嵌套
l1 = [[1,2],[3,4],[5,6]]
for elem in l1:
    for value in elem:
        print(value, end=' ')
    print('')

4.序列的通用操作

#1.列表组合  将两个列表拼接为一个列表
#直接使用加号
list1 = [43,65,76,6]
list2 = [45,77,90,11,2,4,66]
print(list1 + list2)  #[43,65,76,6,45,77,90,11,2,4,66]  产生一个新列表

#2.列表重复
#直接使用乘号 列表内容重复指定遍数,产生一个新列表
print(list1 * 2)  # [43,65,76,6,43,65,76,6]

#3.成员操作
#成员运算符:in      not in
#运算的结果为布尔值
list3 = ["hello",False,189,"good"]
print(189 in list3) #True
print(180 not in list3)  #True

#4.列表的截取【分片,切片】
#语法:列表名[开始下标:结束下标:步长],表示按指定步长获取从开始下标到结束下标之间的元素,
#     结果为一个新的列表
#注意:包头不包尾【前闭后开区间】   [开始下标,结束下标)
#步长:默认是1,正数表示从左向右取,负数表示从右向左取
list1 = [10,20,30,40,50,60]
print(list1[0:3])   #[10,20,30]
print(list1[:3])    #[10,20,30]
print(list1[:])     #[10,20,30,40,50,60] 从头取到尾
print(list1[::2])     # [10,30,50] 隔一个取一个
print(list1[3::-1])  #[40, 30, 20, 10]  从右向左取
print(list1[-1:-3:-1]) #[60, 50] 从右向左取
print(list1[2:]) #[30, 40, 50, 60] 从下标为2的元素开始取到末尾
print(list1[-3::-1])#[40, 30, 20, 10] 从右向左取到第一个元素

#5.列表长度
print(len(list1))

#6.列表最大值和最小值、求和
print(max(list1))
print(min(list1))
print(sum(list1))

5.列表的操作

l1 = [10,20,30]

5.1 增加元素

#1. list.append(obj) 在列表末尾添加新的元素
l1.append(40) #可以是普通元素 
#l1[len(l1):len(l1)] = [40] #等价于l1.append(40)
print(l1)     # [10,20,30,40] 
l1.append([50,60]) #也可以是其它列表、元组、字典、集合等对象
print(l1)     # [10,20,30,40,[50, 60]]

#2. list.extend(obj)  在列表的末尾一次性追加另一个列表中的元素
#obj不能是单个数值,可以是列表等可迭代对象
l1.extend([70,80])  #只是将元素添加到l1末尾
print(l1)

#3. list.insert(i,obj) 在指定下标i的位置插入一个新元素,原来的元素后移,不会覆盖
l1.insert(1,-20)
print(l1)    #[10, -20, 20, 30, 70, 80]
l1.insert(0,[1,2,3])
print(l1)   #[[1, 2, 3], 10, -20, 20, 30, 70, 80]

5.2 删除元素

#1. list.pop(i) 删除指定下标的元素,如果下标越界,会出现IndexError
value = l1.pop()   #删除最后一个元素,并返回该元素的值
print(value)
print(l1)
l1.pop(0)   #删除下标为0的元素
print(l1)
#2. list.remove(x) 删除列表中第一个值等于x的元素,删除的时候是从左向右找到第一个等于x的元素删除
l1.remove(-20)
print(l1)
# l1.remove(100) 如果列表中没有该值,会引起错误:ValueError

#3.按下标删除
del l1[0]
del l1[0:2]  #删除第一个和第二个元素

#3 list.clear()  清空列表
l1.clear()
print(l1)  #[]

5.3 查找元素

#1. list.index(x,start,end) 在[start  end)范围内查找第一个等于x的元素的下标
#参数说明: x 要查找的元素; start,开始下标;end 结束下标,不包含结束下标
#返回值:如果有值等于x的元素,返回其下标,如果不存在值等于x的元素,会引发ValueError
print(l1.index(10))    #1
print(l1.index(330,2,5))  #4

#2 list.count(x) 查找列表中x出现的次数,如果没有x,返回0
print(l1.count(30))   #2
print(l1.count(99))   #0 不存在99

5.4 列表反转

#把列表元素逆序排列
l1.reverse()
print(l1)

5.5 列表排序

#1. list.sort(key=None,reverse=None) 列表方法,实现列表就地排序,不产生新列表
#参数:key参数指明用哪个函数进行排序,默认值是None,用<进行比较  可选参数
      reserse:布尔值,默认值是None,也就是假,从小到大排序,如果设置为True,则从大到小排序,可选参数
l1 = [90,30,70,20,10,60]
print(l1)  # [90, 30, 70, 20, 10, 60]
l1.sort()
print(l1)  # [10, 20, 30, 60, 70, 90]

6 二维列表

就是列表的元素还是列表

list1 = [[1,2,3],[4,5,6]]
#获取元素
print(list1[0][0],list1[0][1],list1[0][2]) #1  2  3

7.range

系统提供内建函数range(start,end,[step=1]),生成一个等差序列[start, end),注意序列属于不可变序列,不支持元素修改,不支持+和*操作。range一般用于for-in循环遍历

#range(start,end,step=1)
#参数:start,开始值,默认是0;
#      end 结束值(序列不包括该值),必须大于start
r1 = range(1,11) #[1,2,3...10]
r2 = range(10)  #[1,2,3,...9]
r3 = range(1,11,2)  #[1,3,5,7,9]

#求1+2+....+100的和
sum = 0
for i in range(1,101):
    sum += i
print(sum)

#求100以内的偶数和
sum = 0
for i in range(0,100,2):
	sum += i
print(sum)

#按下标列表遍历
l1 = [10,80,65,43,90]
i = 0
while i < len(l1):
	print(i,l1[i])

#或者
for i in range(len(l1)):
    print(i,l1[i])

8.随机数

import random

函数名 函数说明
choice(seq) 返回一个序列(列表、元组,字符串)中返回一个随机元素
randrange(start,end,step) start 指定范围的起始值 包含本身 end 指定范围的结束值 不包含本身 step 步长
randint() 返回一个随机整数
shuffle(seq) 将序列元素随机排列(打乱顺序)

相关代码:

# 声明
names = ['jack','tom','lucy','superman','ironman']  # 列表

computer_brands = []


# 增删改查

# 地址

print(id(names))
print(id(computer_brands))

# 查: 通过下标
# 元素获取使用: 下标  索引
print(names[0])
print(names[1])

# 获取最后一个元素
print(names[-1])

print(len(names))

print(names[len(names)-1])

#获取第一个元素
print(names[-5])


# 结合循环
# for i in 'hello':
# 	print(i)
print('***************')
for name in names:
	print(name)

# 查询names里面有没有保存超人
for name in names:  # name = jack   name=tom

	if name == 'superman':
		print('有超人在里面!')
		break
else:
	print('没有找到超人在里面!')


# 简便  't' in 'they'  ----> True  False

if 'superman' in names:   # 判断有没有
	print('有超人在里面!')
else:
	print('没有找到超人在里面!')
# 增删改

brands = ['hp','dell','thinkpad','支持华为','lenovo','mac pro','神州']  # HASEE

# 改
print(brands)

print(brands[-1])

brands[-1]='HASEE'   # 赋值  步骤:1.找到(使用下标)  2. 通过=赋值  3.新的值覆盖原有的值

print(brands)


print('-------------------')
# HUAWEI

# for brand in brands:
# 	if '华为' in  brand:
# 		brand= 'HUAWEI'

# print(brands)


for i in range(len(brands)):
	# i是0,1,2,3,。。。 ---》 下标
	if '华为' in brands[i]:
		brands[i]='HUAWEI'
		break

print(brands)



# 删除  del  是 delete的缩写

del brands[2]

print(brands)


# 删除 只要是 hp , mac 都要删除
print('-----------删除---------------')
# l=len(brands)

# for i in range(l):
# 	if 'hp' in brands[i] or 'mac' in brands[i]:
# 		del brands[i]
# 		# break

# print(brands)


l=len(brands)
i=0
while i<l:
	if 'hp' in brands[i] or 'mac' in brands[i]:
		del brands[i]
		l-=1  # 长度的减少

	i+=1  # 下标的增加

print(brands)


'''
  They are students
  yews


  words = ['hello','good','apple','world','digit','alpha']

  提示输入一个单词比如:hello,如果输入的单词在列表中则删除

  最后打印删除后的列表


'''

w = 'helloaa'

if 'll' in w:
	print('zai')
'''

  words = ['hello','good','apple','world','digit','alpha']

  提示输入一个单词比如:hello,如果输入的单词在列表中则删除

  最后打印删除后的列表

'''

words = ['hello','good','gooo','world','digot','alpha']

w = input('请输入一个单词:')

# 方式1:
# if w in words:
# 	print('存在次单词')

#    'abc'  in ['abc','hello','aaaa',..] 内容有没有在列表中存在   
 #    'go'  in  'good'  判断字符串w有没有出现在word 
# for word in words:  
# 	if w == word:     # ==   'go'=='good'           in 
# 		print('存在此单词!')
# 		break


# for word in words:
# 	if w in word:
# 		del word
# 		break

# print(words)

words = ['hello','goods','gooo','world','digot','alphago']

w = input('请输入一个单词:')

i = 0  # 表示下标

l = len(words)  # 5

while i<l: #  i<5
	if w in words[i]:
		del words[i]
		l-=1
		# i-=1
		continue
		
	i+=1

print(words)



# 字符串切片操作

# s = 'abcdefg'  s[2:5]  --->cde

#  标号:

list1 = ['杨超越','热巴','佟丽娅','杨幂','赵丽颖','刘亦菲','黑嘉嘉',100,99.9]

print(list1)

print(list1[3])

# 列表也是支持切片   从左向右

print(list1[3:6])  # 将截取的结果再次保存在一个列表中  ['杨幂','赵丽颖','刘亦菲']

print(list1[-3:-1])

print(list1[::2])  # 步长

print(list1[-5:-1:2]) # 


# 反方向  从右向左
print(list1[-1::-1])

print(list1[-1::-2])  # [99.9,'黑嘉嘉','赵丽颖','佟丽娅','杨超越']

# list列表的添加:
# 临时小数据库:list

# 创建一个空列表

girls = ['杨幂']
# quit  表示退出

# 列表的函数使用: append   extends  insert

# append() 末尾追加
# while True:

# 	name = input('请输入你心目中的美女名字:') 
# 	if name=='quit':
# 		break

# 	girls.append(name)

# print(girls)



# extend  类似列表的合并
names=['黑嘉嘉','孙俪','巩俐','王丽坤']

# name = input('请输入你心目中的美女名字:')  
# girls.extend(names)


print(girls)

# 符号  +   也可以用于列表的合并

girls = girls+names
print(girls)



# insert   插入

# ['杨幂','黑嘉嘉','孙俪','巩俐','王丽坤']
#   0       1        2      3    4

# append 末尾追加
# insert 指定位置添加
# extend 一次添加多个元素

girls.insert(1,'刘涛')

print(girls)

# 产生10个随机数,将其保存到列表中
'''
步骤:
1. 如何产生随机数
2. 10个数字产生
3. 将产生的随机数放到列表中
4. 打印列表
'''
import  random

# random_list=[]  # 用来存放随机数

# for i in range(10):
# 	ran = random.randint(1,20)
# 	# 保存到列表中
# 	random_list.append(ran)

# print(random_list)



# 产生10个不同的随机数,将其保存到列表中
# random_list=[]

# for i in range(10):
# 	ran = random.randint(1,20)

# 	# if ran in random_list:
# 	# 	pass
# 	# else:
# 	# 	random_list.append(ran)

# 	if ran not in random_list:
# 		random_list.append(ran)

# print(random_list)  # 个数不一定是10个

random_list=[]

i=0

while i<10:
	ran = random.randint(1,20)

	if ran not in random_list:
		random_list.append(ran)
		i+=1

print(random_list)


# 找出列表中的最大值  max(list) ---->列表中的最大值
max_value = max(random_list)
print(max_value)

min_value = min(random_list)
print(min_value)


print('------------自定义求最大值和最小值---------------')

# 假设列表中的第一个元素就是最大值
mvalue=random_list[0]

minvalue = random_list[0]  # 假设的最小值

for value in random_list:
	# 求最大值
	if value>mvalue:
		mvalue=value
	# 求最小值
	if value<minvalue:
		minvalue=value


print('最大值是:',mvalue,',最小值是:',minvalue)

# 求和

he = sum(random_list)
print('系统计算求和:',he)

# 声明累加的变量名sum_1
sum_1=0

for value in random_list:
	sum_1+=value

print(sum_1)


# 排序: sorted 排序  默认是升序
# sorted(list)  ---> 默认是升序  1,2,3,4,5,6
# sorted(list,reverse=True)   ---->降序   6,5,4,3,2,1

new_list = sorted(random_list,reverse=True)
print(new_list)

# 自己写: 冒泡排序法
# 

if 'good'=='good':   # == 比较的是内容 'good'  'good'
	print('相等')

if 'good' in 'goods':  # in   运算符  应用在字符串判断中  也可以用在[]
	print('相等或者包含')


i=1

for w in ['goods','good','abc','aaaa']:
	# w=goods   w=good   w=abc    w=aaaa
	print('good' in w)   # True    True    False   False 
	print('------->',i)
	i+=1


# A. 1   B,2   C.1,2  D: 以上都对


if 'good' in ['goods','good','abc','aaaa']:
	pass


'''
 if 让 in 判断作为一个条件表达式:
   if 'a' in 'abc':
   	pass

   if 'a' in ['a','b','c']:
   	 pass

 但是:
 for ... in    循环条件  

 for 变量  in 字符串|列表:
 	pass



'''


'''


'''

a=6
b=9

# temp = a  # temp =6
# a = b
# b = temp

# print(a,b)
# a,b=0,1
a,b=b,a
print(a,b)

你好:我的2025