列表 List
引导
存储5个人的年龄,求他们的平均年龄
age1 = 19
age2 = 25
age3 = 8
age4 = 40
age5 = 1
print((age1+age2+age3+age4+age5)/5)
求100个人的平均年龄呢?定义一百个变量?这个时候我们需要一个可以存储一百个年龄的变量类型:list
# 先用5个举例
age_list = [19, 25, 8, 40, 1]
print(sum(age_list)/5)
-
列表是描述一组数据的集合,也可以称为数据的容器
-
列表是Python中内置有序、可变序列,列表的所有元素放在一对中括号“[]”中,并使用逗号分隔开;
-
当列表元素增加或删除时,列表对象自动进行扩展或收缩内存,保证元素之间没有缝隙;
-
列表中的数据类型可以各不相同,可以同时分别为整数、实数、字符串等基本类型,甚至是列表、元组、字典、集合以及其他自定义类型的对象。
-
列表中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推
1. 创建一个列表
-
格式:列表名 = [列表选项1,列表选项2,列表选项3…列表选项n]
-
创建列表
# 创建一个空列表 list1 = [] print(list1) # 创建一个有相同元素的列表 list2 = [1,2,3,4] print(list2) # 创建一个有不同元素的列表 list3 = [1,2,"a", "b", True, False] print(list3) # 创建一个重复的列表 list4 = list3*3 print(list4) # 列表组合 list5 = list2 + list3 print(list5)
2. 访问列表元素
使用下标直接访问列表元素,如果指定下标不存在,则抛出异常
-
访问单个元素
# 根据下标取出列表中的单个元素 List = [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] print(List[3]) # 根据下表修改列表元素 List[3] = 5.5 print(List) # 获取超出下标范围的数据 print(List[15])
-
访问一定范围的元素
lucky_number = [0,1,2,3,4,5,6] # 分片 print(lucky_number[0:3]) # 从0到3 print(lucky_number[-5:-1]) # 从倒数第5个到倒数第1个 #捷径 print(lucky_number[:4]) # 从头到第4位 print(lucky_number[:-4]) # 从头到倒数第4位 print(lucky_number[4:]) # 从第4位到最后 print(lucky_number[-4:]) # 从倒数第4个到最后 #步长 print(lucky_number[0:4:2]) # 从0到4,隔一个取一个 print(lucky_number[::2]) # 从头到尾,隔一个取一个 print(lucky_number[::-2]) # 从尾到头,隔一个取一个
-
二维列表拿数据
二维列表(嵌套列表):元素全是列表的列表
numbers =[[1,2,3], [4,5,6]] # 取列表中的第一个列表 print(numbers[1]) # 取列表中的第一个列表中的第一个元素 print(numbers[1][1])
3. 列表判断
list1 = [1,2,3,4,5,6]
print(1 in list1)
print(1 not in list1)
4. 列表删除
可以使用 del 语句来删除列表的的元素
list = ['Google', 'Runoob', 1997, 2000]
print ("原始列表 : ", list)
del list[2]
print ("删除第三个元素 : ", list)
5. 列表排序
-
内置函数 sorted(list) 对列表进行排序并返回新列表
-
使用列表对象的 sort() 方法进行原地排序
# sorted() list1 = [7, 4, 9, 3, 1, 6, 5] # 从小到大排序,并创建并返回了一个新列表list2 list2 = sorted(list1) print(list2) # 从大到小排序 list3 = sorted(list1, reverse=True) print(list3) # 原列表不变 print(list1) # sort() list4 = [7, 4, 9, 3, 1, 6, 5] # 从小到大排序,对原列表进行排序,并未产生新的列表 list4.sort() print(list4) # 从大到小排序 list4.sort(reverse=True) print(list4)
6. 列表函数
-
len(list) 获取列表元素个数
list = ['Google', 'Runoob', 1997, 2000] print(len(list))
-
max(list) 获取列表元素最大值
list = ['2019', '2020', '1997', '2000'] print(max(list))
-
min(list) 获取列表元素最小值
list = ['2019', '2020', '1997', '2000'] print(min(list))
-
sum(list) 列表元素的和
list1 = [1,2,3,4,5,6,7,8] print(sum(list1))
-
enumerate(list): 枚举列表元素,返回枚举对象,其中每个元素为包含下标和值的元组。该函数对元组、字符串同样有效
list = ['2019', '2020', '1997', '2000'] for elements in enumerate(list): print(elements) # 下表和列表元素分别打印 for index,elements in enumerate(list): print(index) print(elements)
-
zip(list1, list2) 函数返回可迭代的zip对象。
list1 = [1, 2, 3] list2 = [5, 6, 7, 8] # 返回zip对象 zip = zip(list1, list2) print(zip) # 把zip对象转换成列表 list3 = list(zip) print(list3)
-
list(seq) 将元组转为列表
seq = ('2019', '2020', '1997', '2000') print(list(seq))
7. 列表方法
list = [1,2,3,4,5]
# 追加单个元素
list.append(6)
print(list)
# 追加列表
list.append([7,8,9])
print(list)
list1 = [1,2,3,4,5]
list2 = [6,7,8]
list1.extend(list2)
print(list1)
# 插入一个元素
list1 = [1,2,3,4,5]
list1.insert(1, 99)
print(list1)
# 插入一个列表
list1 = [1,2,3,4,5]
list2 = [6,7,8]
list1.insert(0, list2)
list1 = [1,2,3,4,5]
# 删除最后一个
last_world = list1.pop()
print(last_world)
print(list1)
# 删除任意一个
second_world = list1.pop(2)
print(second_world)
print(list1)
list1 = ["a", "b", "c", "d", "c"]
list1.remove("c")
print(list1)
list1 = ["a", "b", "c", "d", "c"]
print(list1)
list1.clear()
print(list1)
list1 = ["a", "b", "c", "d", "c"]
# 全列表查找元素的位置
print(list1.index("c"))
# 指定范围查找元素位置(查找不到会报错)
print(list1.index("a", 1, 3))
print(list1.index("c", 1, 3))
list1 = ["a", "b", "c", "d", "c", "f", "a", "c"]
print(list1.count("c"))
list1 = ["a", "b", "c", "d", "e", "f",]
list1.reverse()
print(list1)
-
拷贝
copy() 方法,意思是复制一个相同的列表
name_list = ["张三", "李四", "王五"] # 把 name_list 复制,赋值给 name_list2 变量 name_list2 = name_list.copy() # 分别输出 name_list name_list2 print(name_list) print(name_list2)
把 原列表中的 “李四” 改成英文 LiSi,那么 name_list2的 “李四” 会发生变化吗?
name_list = ["张三", "李四", "王五"] # 把 name_list 复制,赋值给 name_list2 变量 name_list2 = name_list.copy() # 把李四改成英文LiSi name_list2[1] = "LiSi" # 分别输出 name_list name_list2 print(name_list) print(name_list2)
只是把name_list列表中的 李四 改成了 LiSi,name_list2 列表中没有变,其实它的原理很简单,如下图
首先,name_list 指向一个列表,然后把 name_list 复制了一份,赋值给 name_list2 ,由于 修改的是 第一个 列表的 李四,所以第二个列表不受影响。
那么现在我改一下这个列表,从name_list 列表中再添加一个列表
name_list = [["赵六","李四"],"张三", "钱七", "王五"] # 把 name_list 复制,赋值给 name_list2 变量 name_list2 = name_list.copy() # 把李四改成英文LiSi name_list2[0][1] = "LiSi" # 分别输出 name_list name_list2 print(name_list) print(name_list2)
中间那个列表是单独分配了一块空间,然后从第一层列表中去引用地址,复制的name_list2也是引用的地址,所以真实的值一变,两个列表的内部列表的值也就变了。
第二个列表copy 第一个列表,实际上第二个列表的每个元素是第一个列表每个元素的引用
也就是说 list.copy() 方法只能 copy 一层,这就是所谓的浅复制。
**实现浅复制的三种方法: **
import copy
names = [["张三", "李四"], "小明", "小红", "小黑", "小黄", "小白"]
# 1.
names1 = copy.copy(names)
# 2.
names2 = names[:]
# 3.
names3 = list(names)
# 修改李四为LiSi
names[0][1] = "LiSi"
# 打印4个列表
print(names)
print(names1)
print(names2)
print(names3)
深复制的方法
import copy
names = [["张三", "李四"], "小明", "小红", "小黑", "小黄", "小白"]
# 深复制
deep_names = copy.deepcopy(names)
# 修改李四为LiSi
names[0][1] = "LiSi"
# 分别打印输出两个列表
print(names)
print(deep_names)
练习
练习:
-
写一个程序,让用户输入很多个整数,当输入小于0的数是结束输入
1)输出这些数的和 sum
2)输出这些数的最大的数和第二大的数 max l.remove
3)删除最小的数
4)按照原来的输入顺序打印出剩余的数
-
输入一个整数n 代表结束的数,将1-n之间所有的素数计算出来,并存入到列表
素数是指除了1和它本身以外不被其他正整数整除
1)最后打印此列表中的全部素数
2)打印这些素数的和
l=[] sum=0 i=int(input("请输入结束数:")) for x in range(1,i+1) : b=0 for n in range(2,x): if x%n!=0: b+=1 continue if b==x-2 or x==1: l.append(x) x+=1 for x in l: sum+=x print(l,sum)
-
求100以内有哪些整数与自身加 1的乘积在11求余的结果等于8
打印这些数
将这些数存于列表当中(列表推导)
[x for x in range(1,101) if x*(x+1)%11==8]
-
计算20个斐波那契数,存于列表中,打印这20数
1,1,2,3,5,8,13。。
从第三个数起,后一个数是前两个数之和
l=[1,1] a=1 while len(l)<20: a+=1 if a==l[-1]+l[-2]: l.append(a) print(l)