目录
(1)概念:将多种类型数据使用逗号分割放置在中括号中的一组可变序列
(5)索引引用:listname[索引],如:team[0],team[1],team[2]
(1)在python中包含其他对象的对象,称为容器,是一种数据结构。
(2)常用容器分为两种:序列(如:列表、元组)和映射(如字典)
<1> 格式:listname=[element1,element2,element3……,elementn]
例:
- a = [2, 3, 4, 5]
- b = ['china', 'hello', 'world']
- c = [45.6, 'hello', '中国']
- print(a, b, c, sep='\n')
- # [2, 3, 4, 5]
- # ['china', 'hello', 'world']
- # [45.6, 'hello', '中国']
<4> 创建空列表:listname = []
PS:为了提高程序可读性,建议在列表中存储相同类型的数据
<4> 使用list()内置函数创建列表:
例:
- t1 = list()
- t2 = list('china')
- print(t1, t2, sep='\n')
- # []
- # ['c', 'h', 'i', 'n', 'a']
<5> 使用range()创建数值迭代列表:
- t3 = list(range(10, 20, 2)) # 10-20的数值中,创建步长为2的列表
- print(t3)
- # [10, 12, 14, 16, 18]
PS:list()参数必须为可迭代对象,否则将报错
- 将列表转换为列表无意义,浪费资源:
- t1 = [1, 2, 3, 4, 5, 6, 7]
- t2 = t1
- print(t1)
- # [1, 2, 3, 4, 5, 6, 7]
<1> 格式1:del listname
- team = ['皇马', '拜仁', '梵蒂冈', '罗马']
- del team
- # print(team) 报错
- # 删除的是引用指向,列表还在
<2> listname.clear():清空列表内容,保留列表结构
- team = ['皇马', '拜仁', '梵蒂冈', '罗马']
- team.clear()
- print(team)
- # []
PS:python自带垃圾回收机制,会自动销毁不同列表,一般不需要手动删除
<1> 作用:在序列中每个元素都有一个编号(下标),可用于访问元素
<2> 原则:由左向右从 0 开始递增,也可由右向左从-1开始递减
<3> 例:
<1> 注意:可以通过列表索引删除元素:del listname[索引]。当为空列表,不能通过索引访问引用
- team = []
- team[0] # 报错
<1> 作用:通过切片可以访问一定范围内的元素
<2> 格式:listname[start:end:step]
<3> 例:
- t1 = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
- # 0 1 2 3 4 5 6 7 8 9
- print(t1[0:7:4]) # 输出索引0-6,间隔为4的值
- print(t1[1:5]) # 1索引开始,到4索引结束,默认间隔为1
- print(t1[2:]) # 2索引开始到结尾
- print(t1) # 输出列表全部内容
- print(t1[:]) # 全部内容
- print(t1[::]) # 全部内容
- print(t1[0:]) # 全部内容
- print(t1[:-1]) # 正序输出,不包含最后一个数
- # 相当于 print(t1[0:-1:1])
- print(t1[0:6:0]) # 报错,步长不能为0
- print(t1[::-1]) # 反向输出
<1> 作用:将相同类型的序列连接,但是不会去掉重复值
<2> 符号:+(列表的连接)
<3> 示例:
- 例1:
- t1 = [1, 2, 3]
- t2 = [4, 5, 6]
- t3 = ['hello']
- t4 = ['world']
- t5 = t1 + t2
- t6 = t3 + t4
- t7 = t5 + t6
- print(t5, t6, t7, sep='\n')
- # [1, 2, 3, 4, 5, 6]
- # ['hello', 'world']
- # [1, 2, 3, 4, 5, 6, 'hello', 'world']
- 例2:列表和常量连接会报错
- t1 = [1, 2, 3, 4, 5, 6, 7]
- print(t1 + 8) # 报错
- t2 = ['hello', 'world']
- print(t2 + 'china') # 报错
<1> 作用:使用数字n乘以一个列表会进行复制,重复n次
<2> 符号:*
<3> 示例:
- 例1:
- t1 = [1, 2, 3]
- t2 = ['hello', 'world']
- print(3 * t1)
- print(2 * t2)
- # [1, 2, 3, 1, 2, 3, 1, 2, 3]
- # ['hello', 'world', 'hello', 'world']
- 例2:初始化长度为n的空列表
- emptylist = [None] * 5
- print(emptylist)
- # [None, None, None, None, None]
<1> 作用:检查某个元素是否为列表成员
<2> 格式:value in listname 或 value not in listname(value---被检查的元素)
<1> 计算列表长度:len(listname)
<2> 计算列表最大值:max(listname)
<3> 计算列表最小值:min(listname)
<4> 计算列表元素和:sum(listname)
<1> 处理数值:
<2> 处理索引和数值:
<1> 例1:输出列表最大值
- import random as r
- 法1:
- t1 = r.sample(range(10, 20), 10)
- # 产生10-30,10个随机数
- print(t1)
- print('max=', max(t1))
- 法2:
- # 将列表排序后输出最大值
- t1 = r.sample(range(10, 20), 10)
- # 产生10-30,10个随机数
- t1.sort()
- print(t1)
- print('max=',t1[-1])
- 法3:for循环输出最大值
- t1 = r.sample(range(10, 30), 10)
- print(t1)
- max = t1[0] # max变量存储列表的第一个元素
- for i in t1:
- if max < i:
- max = i # 将最大值存储到列表中第一个元素中
- print('max=', max)
-
- # [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
- # max= 19
<2> 例2:将列表中值为偶数,索引为奇数的值输出
- import random as r
-
- t1 = r.sample(range(10, 30), 10)
- print(t1)
- for index, item in enumerate(t1):
- if item % 2 == 0 and index % 2 == 1:
- print(index, item)
- # [19, 25, 18, 10, 15, 22, 23, 17, 21, 14]
- # 3 10
- # 5 22
- # 9 14
<3> 例3:素数筛选判断法:筛选出100以内的素数
产生2-99的序列:2 3 4 5 6 7 8 9......99
- list1 = list(range(0, 101)) # 产生0-100的列表
- print()
- i = 2 # 从最小素数2开始
- while i < 100: # 遍历列表
- j = list1[i] * 2 # 计算当前值的倍数
- while j < 100:
- list1[j] = 0 # 将倍数置为0
- j = j + list1[i]
- i += 1
- while list1[i] == 0:
- i += 1 # 排除已经置为0的元素不再遍历
- # 循环数除列表中不是0的素数
- t = 0
- for i in range(2, 100):
- if list1[i] != 0:
- t += 1
- print(list1[i], end=' ')
- if t % 10 == 0:
- print()
- # 2 3 5 7 11 13 17 19 23 29
- # 31 37 41 43 47 53 59 61 67 71
- # 73 79 83 89 97
<1> 添加元素:listname.append(obj)
<2> 例:将值为奇数,索引为偶数的元素存储到另一个列表中
- import random as r
-
- t1 = r.sample(range(10, 30), 10)
- t2 = []
- for index, item in enumerate(t1):
- if item % 2 == 0 and index % 2 == 1:
- t2.append(item)
- print(t2)
- # [12, 28]
<3> 例:删除元素
- import random as r
-
- t1 = r.sample(range(10, 30), 10)
- print(t1)
- n = int(input('请输入需要删除的元素的值:'))
- t1.remove(n)
- print(t1)
- # [26, 22, 28, 23, 10, 14, 11, 17, 19, 13]
- # 请输入需要删除的元素的值:26
- # [22, 28, 23, 10, 14, 11, 17, 19, 13]
<1> 格式:listname.count(obj)
<2> 作用:获取元素在列表中出现的次数,只能精确匹配
<3> 注意:count()方法与remove()方法配合使用,删除前首先统计元素是否存在
<4> 例:删除列表中元素的值,删除前可确认元素在不在列表中
- import random as r
-
- t1 = r.sample(range(10, 30), 10)
- print(t1)
- n = int(input('请输入需要删除的元素的值:'))
- if t1.count(n) > 0:
- t1.remove(n)
- print(t1)
- else:
- print('输入元素不在列表中')
- # [28, 18, 23, 16, 26, 13, 10, 27, 20, 11]
- # 请输入需要删除的元素的值:1
- # 输入元素不在列表中
<1> 选择法排序:有n个元素参与排序,一共进行n-1次比较,每次都是当前值与下一个值进行比较,比较到n之前结束(大于号是升序,小于号是降序)
- t1 = r.sample(range(10, 20), 10)
- print('排序前:', t1)
- for i in range(len(t1) - 1):
- for j in range(i + 1, len(t1)):
- if t1[i] > t1[j]:
- t1[i], t1[j] = t1[j], t1[i]
- print('排序后:', t1)
- # 排序前: [11, 13, 14, 16, 10, 15, 19, 12, 18, 17]
- # 排序后: [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
<2> 插入法排序:将无序序列分成两个部分,( 前:有序, 后:无序 )通过构建有序序列;对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入;插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间
- import random
-
- t1 = random.sample(range(0, 10), 10)
- print('排序前:', t1)
- for i in range(0, 10):
- t = t1[i] # t为待插入元素
- j = i - 1
- while j >= 1 and t < t1[j]:
- t1[j + 1] = t1[j]
- j = j - 1
- t1[j + 1] = t # 插入备份元素
- print('排序后:', t1)
- # 排序前: [0, 9, 7, 3, 5, 2, 8, 4, 6, 1]
- # 排序后: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<3> 排序归类:
<4> 使用sort()方法排序:
例:对列表进行升序和降序排序
- import random as r
-
- l1 = r.sample(range(0, 20), 10)
- print(l1)
- l1.sort() # 升序
- print(l1)
- l1.sort(reverse=True) # 降序
- print(l1)
- # [11, 17, 5, 2, 6, 19, 13, 10, 1, 8]
- # [1, 2, 5, 6, 8, 10, 11, 13, 17, 19]
- # [19, 17, 13, 11, 10, 8, 6, 5, 2, 1]
<5> 使用内置sorted()
例:对列表进行降序排序
- import random as r
-
- l1 = r.sample(range(0,10),10)
- print(l1)
- print(sorted(l1,reverse=True))
- print(l1)
- # [9, 0, 3, 2, 8, 4, 5, 7, 1, 6]
- # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
- # [9, 0, 3, 2, 8, 4, 5, 7, 1, 6]
<1> index()方法:用来查找某个元素在列表中第一次出现的位置(索引)。若无该元素,会导致valueError 错误,所以一般使用count()方法判断是否存在
示例:
- 例1:在列表中查找数据
- l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
- print(l1.index(2)) # 在列表中查找数值为2的元素索引下标
- print(l1.index(8, 3, 10)) # 在下标为3-10的索引中查找数值为8的索引下标
- print(l1.index(6, 3)) # 3索引开始到结束,查找数值6
- # print(l1.index(4,0,3)) # 在[0,3)索引中查找4,未找到报错,可采用count()判断
- 例2:列表andy,内容包含名称和一系列比赛得分,计算他在第几场得到最高分
- andy = ['andy', 23, 24, 45, 34, 56, 78]
- print(andy)
- score_max = max(andy[1:])
- i = andy.index(score_max)
- print(andy[0], '在%d场得到最高分%d' % (i, score_max))
- # ['andy', 23, 24, 45, 34, 56, 78]
- # andy 在6场得到最高分78
<2> 使用in not in查找列表元素
- l1 = [12, 234, 56, 7, 8, 990, 89]
- print(12 in l1) # True
- print(123 not in l1) # True
<3> 折半查找(二分法查找):必须是有序(升序)序列,若为无序应先排序
- import random
-
- l1 = random.sample(range(0, 10), 10)
- l1.sort()
- print(l1)
- n = int(input('请输入待查找的值'))
- i = 0
- j = 9
- while i <= j:
- mid = (i + j) // 2 # 若为偶数个元素,折半查找的中间数向左偏
- # 计算中间数索引
- if l1[mid] == n:
- print('已找到')
- break
- else:
- if n < l1[mid]:
- j = mid - 1 # 向左折半
- else:
- i = mid + 1
- if i > j:
- print('未找到')
- # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- # 请输入待查找的值5
- # 已找到
<1> 格式:listname.reverse()
<2> 示例:
- import random
-
- l1 = random.sample(range(0,20),10)
- print(l1)
- l1.reverse()
- print(l1)
- # [12, 10, 9, 4, 8, 5, 2, 17, 3, 15]
- # [15, 3, 17, 2, 5, 8, 4, 9, 10, 12]
PS:永久性改变,若要使用原始数据,只需要再次逆置一次
<1> 作用:将列表的元素组成一个字符串
<2> 格式:char.join(seq)
- char = '-'
- l1 = ['hello', 'world', 'education']
- print(char.join(l1))
- print('=='.join(l1))
- print('\n'.join(l1))
- # hello-world-education
- # hello==world==education
- # hello
- # world
- # education
<1> 列表之间的赋值操作
- l1 = [1, 2, 3, 4, 5]
- l2 = l1 # 相当于给同一内存区域,起另一个名字
- print(id(l1), id(l2))
- for i in range(len(l1)):
- l1[i] += 1 # 给列表l1中所有元素加1
- print(l1)
- print(l2)
- # 1781136982272 1781136982272
- # [2, 3, 4, 5, 6]
- # [2, 3, 4, 5, 6]
分析:列表的赋值相当于取别名,即两者都指向同一个堆栈区的地址列表。操作任意一个,另一个同步发生变化。
<2> 浅拷贝:浅拷贝针对不可变元素会完全隔离,有可变元素无法实现完全隔离
- l1 = [1, 2, 3, 4, 5]
- l2 = l1.copy() # l2是l1的浅拷贝结果
- print(id(l1), id(l2))
- for i in range(len(l1)):
- l1[i] += 1
- print(l1)
- print(l2)
- # [2, 3, 4, 5, 6]
- # [1, 2, 3, 4, 5]
分析:l2是l1的浅拷贝,id与l1不同,这是因为通过浅拷贝,产生一段新的内存地址空间,与l2绑定。内容相同,地址不同;相互隔离,互不影响。但如果列表中出现可变类型,浅拷贝无效。
- l1 = [1, 2, [3, 4, 5]]
- l2 = l1.copy() # l2是l1的半浅拷贝结果
- print(id(l1), id(l2))
- l1[0] += 1
- l1[1] += 1
- l2[2][0] += 1
- l2[2][1] += 1
- print(l1)
- print(l2)
- print(id(l1), id(l2))
- # 2816571507072 2816571535872
- # [2, 3, [4, 5, 5]]
- # [1, 2, [4, 5, 5]]
- # 2816571507072 2816571535872
分析:l1列表两个不可变元素1和2没有改变并未影响l2,但是l1的可变类型元素[3,4]变成了[4,5],l2列表中的子列表也一同发生改变,说明l1和l2并未完全隔离。虽然l1和l2的内存地址互相独立,但是列表第三项绑定的是同一个内存地址,若原列表包含可变类型元素,通过浅拷贝得到的新列表,不能实现与原列表完全隔离,如要完全隔离需要使用深拷贝。
<3> 深拷贝
- import copy
-
- l1 = [1, 2, [3, 4]]
- l2 = copy.deepcopy(l1) # l2是l1的深拷贝
- print(id(l1), id(l2))
- l1[0] += 1
- l1[1] += 1
- l2[2][0] += 1
- l2[2][1] += 1
- print(id(l1), id(l2))
- print(l1)
- print(l2)
- # 2683227889792 2683229572096---深拷贝也改变了外部地址,实现完全隔离
- # 2683227889792 2683229572096---内部可变类型元素地址不同
- # [2, 3, [3, 4]]
- # [1, 2, [4, 5]]
分析:通过深拷贝,列表实现完全隔离,从而实现与原列表真正的完全区分隔离
<1> 作用:可以使用列表推导式生成新列表
<2> 格式:listname = [表达式,for循环变量 in range()]
<3> 例:创建数值为0-9的列表
- l1 = [x for x in range(10)]
- print(l1)
- # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
- l1 = []
- for x in range(10):
- l1.append(x)
- print(l1)
- # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
<4> 创建100-200间的10个随机数
格式:randint(x,y)表示产生一个随机数,范围在x与y之间
- import random
-
- l1 = [random.randint(100, 200) for i in range(10)]
- print(l1)
- # [157, 144, 192, 198, 107, 190, 138, 127, 170, 105]
<5> 根据旧列表生成指定新列表
例:根据原生列表生成数值折半列表
- import random
-
- l1 = [random.randint(0, 100) for i in range(10)]
- print(l1)
- l2 = [x / 2 for x in l1]
- print(l2)
- # [68, 11, 93, 87, 6, 61, 24, 16, 6, 42]
- # [34.0, 5.5, 46.5, 43.5, 3.0, 30.5, 12.0, 8.0, 3.0, 21.0]
<6> 从旧列表中选择符合条件的元素组成新列表
例:创建1-10之间的偶数列表
- import random
-
- l1 = [random.randint(1, 10) for i in range(10)]
- print(l1)
- l2 = [x for x in l1 if x % 2 == 0]
- print(l2)
- # [10, 1, 2, 10, 8, 5, 9, 3, 2, 1]
- # [10, 2, 10, 8, 2]
PS:只用列表推导式来创建新列表,并且尽可能保持简短;若列表推导式代码超过两行,则代码可读性大大降低,应考虑写成循环
<1> 例1:将10个十进制整数存取到列表中,计算列表中的奇数平均值,偶数平均值,偶数方差。
- import numpy
- import random
-
- x = random.sample(range(0, 30), 10)
- a1 = []
- a2 = []
- for i in x:
- if i % 2 == 1:
- a1.append(i)
- else:
- a2.append(i)
- print('奇数平均值:', numpy.mean(a1))
- print('偶数平均值:', numpy.mean(a2))
- print('偶数方差:', numpy.var(a2))
- # 奇数平均值: 15.857142857142858
- # 偶数平均值: 14.0
- # 偶数方差: 98.66666666666667
<2> 例:将输出的空格作为分隔符的数字去重后输出
- # 2 2 2 3 4 5 4 22 2
- # split():将空格分隔的字符串切片后转为字符串列表
- l1 = input('请输入空格分隔的字符内容:').split()
- for i in range(len(l1)):
- l1[i] = int(l1[i])
- print(l1)
- l2 = []
- for i in l1:
- if l2.count(i) == 0: # 统计接收到的列表,若为0则表示追加
- l2.append(i)
- print(l2)
- # 请输入空格分隔的字符内容:2 2 2 3 4 5 4 22 2
- # [2, 2, 2, 3, 4, 5, 4, 22, 2]
- # [2, 3, 4, 5, 22]
<3> 例:合并2个有序列表构成一个新的有序列表
- l1 = list(eval(input('请输入第一个列表:')))
- l2 = list(eval(input('请输入第二个列表:')))
- l1.extend(l2) # extend尾部追加一个元素
- l1.sort()
- print(l1)
- # 请输入第一个列表:1,2,3,4,5,6
- # 请输入第二个列表:7,8,9,0,13,12
- # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 12, 13]
<4> 例:编写程序实现判断列表是否为升序
- l1 = list(eval(input('请输入第一个列表:')))
- f = 1 # 标志位,默认为升序
- for i in range(len(l1) - 1):
- if l1[i] > l1[i + 1]:
- f = 0
- break
- if f:
- print('升序')
- else:
- print('无序')
- # 请输入第一个列表:1,2,3,4,5,6,7,8,9
- # 升序
- # 请输入第一个列表:1,2,4,3,5,7
- # 无序
<5> 例:输入一个十进制转为二进制输出
- a = int(input('请输入一个整数:'))
- print('转为二进制为:', bin(a))
- # 请输入一个整数:12
- # 转为二进制为: 0b1100
-
- a = int(input('请输入一个十进制整数:'))
- l1 = []
- if a == 0:
- print('0000')
- else:
- while a:
- a, r = divmod(a, 2)
- l1.append(r)
- l1.reverse()
- print(l1)
- # 请输入一个十进制整数:12
- # [1, 1, 0, 0]
<6> 例:将列表前p个元素平移到列表尾部输出
- # 法1:
- import random as a
- l1=a.sample(range(0,20),10)
- print(l1)
- p=int(input('请输入移动元素个数:'))
- for i in range(p):
- l1.append(l1[i])
- l1=l1[p:]
- print(l1)
- # [14, 17, 4, 3, 13, 19, 7, 10, 5, 12, 2, 0, 18, 6, 1, 16, 9, 8, 15, 11]
- # 请输入移动元素个数:6
- # [7, 10, 5, 12, 2, 0, 18, 6, 1, 16, 9, 8, 15, 11, 14, 17, 4, 3, 13, 19]
- # 法2
- import random as a
-
- l1 = a.sample(range(0, 20), 10)
- print(l1)
- p = int(input('请输入移动元素个数:'))
- l2 = l1[0:p]
- l1 = l1[p:]
- l3 = l1 + l2
- print(l3)
- # [0, 17, 13, 6, 15, 14, 8, 10, 1, 9]
- # 请输入移动元素个数:3
- # [6, 15, 14, 8, 10, 1, 9, 0, 17, 13]
<1> 格式:listname=[一维列表1],[一维列表2],[一维列表3],[一维列表n]
<2> 示例:
例1:直接创建
- l1=[[1,2,3],
- [4,5,6],
- [7,8,9]]
- print(l1)
- # [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
例2:使用for循环创建
- l1 = []
- for i in range(2):
- l1.append([]) # 每行添加一个空列表
- for j in range(4):
- l1[i].append(j) # 为内层列表添加元素值
- print(l1)
- # [[0, 1, 2, 3], [0, 1, 2, 3]]
例3:利用列表推导式创建
- l1 = [[j for j in range(4)] for i in range(4)]
- print(l1)
- # [[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]]
例4:二维列表的随机数赋值
- import random
-
- l1 = []
- for i in range(4):
- l1.append([]) # 每行添加一个空列表
- for j in range(4):
- t = random.randint(10, 30)
- l1[i].append(t) # 为内层列表添加元素值
- for i in range(4):
- print(l1[i])
- # [19, 24, 14, 18]
- # [18, 14, 20, 16]
- # [24, 15, 23, 18]
- # [29, 28, 24, 28]
例6:计算二维列表每行最大值和每列最小值
- import random
-
- l1 = []
- max1 = []
- min1 = []
- for i in range(4): # 二维列表随机数赋值
- l1.append([])
- for j in range(3):
- t = random.randint(10, 20)
- l1[i].append(t)
-
- for i in range(4): # 输出
- print(l1[i])
-
- for i in range(4): # 计算每行最大值,追加到m1中
- max1.append(max(l1[i]))
-
- for j in range(3): # 计算每列最大值。列项访问,内循环调换位置
- min1.append(l1[0][j]) # 将当前列第一个值追加到最小数值组中
- for i in range(4):
- if min1[j] > l1[i][j]:
- min1[j] = l1[i][j]
- print('每列最小值:', min1)
- print('每行最大值:', max1)
- # [18, 18, 20]
- # [19, 13, 14]
- # [19, 17, 19]
- # [15, 16, 15]
- # 每列最小值: [15, 13, 14]
- # 每行最大值: [20, 19, 19, 16]
<3> 二维列表局部处理
例1:二维列表的左下半三角(行号大于列号),左下半三角元素加1
- l1 = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
- for i in range(4):
- print(l1[i])
- for i in range(4):
- for j in range(4):
- if i > j: # 规则:行>列
- l1[i][j] += 1
- print()
- for j in range(4):
- print(l1[j])
- # [1, 1, 1, 1]
- # [1, 1, 1, 1]
- # [1, 1, 1, 1]
- # [1, 1, 1, 1]
- #
- # [1, 1, 1, 1]
- # [2, 1, 1, 1]
- # [2, 2, 1, 1]
- # [2, 2, 2, 1]
- l1 = [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]
- for i in range(4):
- print(l1[i])
- for i in range(4):
- for j in range(4):
- if i < j: # 规则:行<列
- # 处理l1[ i ] [ j ] +=1
- l1[i][j] += 1
- print()
- for j in range(4):
- print(l1[j])
- # [1, 1, 1, 1]
- # [1, 1, 1, 1]
- # [1, 1, 1, 1]
- # [1, 1, 1, 1]
- #
- # [1, 2, 2, 2]
- # [1, 1, 2, 2]
- # [1, 1, 1, 2]
- # [1, 1, 1, 1]
- l1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 8, 7, 6], [5, 4, 3, 2]]
- for i in range(4):
- print(l1[i])
- print('主对角线:')
- for i in range(4):
- print(l1[i][i], end=',')
- # [1, 2, 3, 4]
- # [5, 6, 7, 8]
- # [9, 8, 7, 6]
- # [5, 4, 3, 2]
- # 主对角线:
- # 1,6,7,2,
- l1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 8, 7, 6], [5, 4, 3, 2]]
- for i in range(4):
- print(l1[i])
- print('副对角线:')
- for i in range(4):
- print(l1[i][4 - i - 1], end=',')
- # [1, 2, 3, 4]
- # [5, 6, 7, 8]
- # [9, 8, 7, 6]
- # [5, 4, 3, 2]
- # 副对角线:
- # 4,7,8,5,
PS:上述四种列表只针对行==列的正方形列表
<4> 例:打印杨辉三角前10行。第0列和主对角线为1,中间内容=上方值+左上方值
- l1=[]
- for i in range(5): # 生成5*5的矩阵,内容为0
- l1.append([])
- for j in range(5):
- l1[i].append([])
-
- for i in range(5):
- for j in range(5):
- if j==0 or i==j: # 定位第0列及主对角线
- l1[i][j] =1
- elif i>j:
- l1[i][j] = l1[i-1][j] + l1[i-1][j-1]
- # 当前值 = 上方值 + 左上方值
- for i in range(5):
- for j in range(5):
- if i>=j:
- print(l1[i][j],end=' ')
- print()
- # 1
- # 1 1
- # 1 2 1
- # 1 3 3 1
- # 1 4 6 4 1
PS:以上内容只适合行==列的正方形矩阵
<5> 周边元素处理,计算4*3二维列表周边元素的平均值的平方根
- import random as dom
- import math
-
- l1 = []
- sum = 0
- for i in range(4): # 创建行
- l1.append([])
- for j in range(3): # 创建列
- t = dom.randint(1, 10)
- l1[i].append(t) # 赋值
- for i in range(4):
- print(l1[i]) # 按行输出
- for i in range(4):
- for j in range(3):
- if i == 0 or j == 0 or i == 4 - 1 or j == 3 - 1:
- sum += l1[i][j]
- sum = sum / 10
- print('结果为:%.2f' % math.sqrt(sum))
- # [5, 10, 10]
- # [6, 7, 1]
- # [8, 5, 4]
- # [8, 3, 6]
- # 结果为:2.47
PS:周边元素:第0行和最后一行,第0列和最后一列
<6> 二维数组列表的排序问题
- import random as dom
-
- l1 = []
- sum = 0
- for i in range(4):
- l1.append([])
- for j in range(3):
- t = dom.randint(1, 10)
- l1[i].append(t)
- print('排序前:')
- for i in range(4):
- print(l1[i])
- for i in range(4):
- l1[i].sort() # 将行进行排序
- print('排序后:')
- for i in range(4):
- print(l1[i])
- # 排序前:
- # [7, 9, 9]
- # [6, 10, 5]
- # [1, 7, 9]
- # [3, 8, 9]
- # 排序后:
- # [7, 9, 9]
- # [5, 6, 10]
- # [1, 7, 9]
- # [3, 8, 9]
<7> 思考1:输出n层正方形二维列表,每层与数字相同,如:
- l1 = []
- n = int(input('请输入层数:'))
- for i in range(2 * n - 1):
- l1.append([])
- for j in range(2 * n - 1):
- l1[i].append(0)
-
- for k in range(1, n + 1):
- for i in range(k - 1, 2 * n - k):
- for j in range(k - 1, 2 * n - k):
- l1[i][j] = k
-
- for i in range(2 * n - 1):
- for j in range(2 * n - 1):
- print(l1[i][j], end=' ')
- print()
- # 请输入层数:3
- # 1 1 1 1 1
- # 1 2 2 2 1
- # 1 2 3 2 1
- # 1 2 2 2 1
- # 1 1 1 1 1
<8> 思考2:输出螺旋矩阵,如:
- l1 = []
- num = 1
- for i in range(10):
- l1.append([])
- for j in range(10):
- l1[i].append(0)
- n = int(input('请输入螺旋矩阵阶数:'))
- for k in range(n // 2 + 1): # 总的循环次数
- for j in range(k, n - k): # 上边
- l1[k][j] = num
- num += 1
- for i in range(k + 1, n - k - 1): # 右边
- l1[i][n - k - 1] = num
- num += 1
- for j in range(n - k - 1, k, -1): # 下边
- l1[n - k - 1][j] = num
- num += 1
- for i in range(n - k - 1, k, -1): # 左边
- l1[i][k] = num
- num += 1
- for i in range(n):
- for j in range(n):
- print('{:3d}'.format(l1[i][j], end=' '))
- print()