如果一个人比你优秀,你尽可以放心交往,因为优秀的人散发正能量!如果一个人有德行,你尽量与他成为一个团队,因为厚德载物!如果一个人有智慧,你尽可安心与他同行,相信智慧能照亮未来!如果一个人活的生命有质量,你可用心与他成为知己,生命才有高度与宽度。
遇到问题,不要盲目的下结论;
每一道题都是我们精心筛选的;
练习2: 给定一个3*3的方阵,求其转置矩阵;
出题意图:给你一个转置矩阵,请你用我们的数据结构(list)来描述它;
最常见的数据结构是列表list
方法1:print打印;可能会被面试官鄙视0分;
不要一上来就用print,面试官可能认为你不会算法;
m = '1 2 3\n4 5 6\n7 8 9'
#print(m)
l_c=len(m.split('\n')) #3
m=m.split() #->list[]
l_row=len(m)//l_c # 3
for i in range(l_row):
for j in range(l_c):
print(m[j*3+i],end=' ')
print('\r')
---------------------------------------------------------------
1 4 7
2 5 8
3 6 9
方法2 :方阵(二维数组) 转换 j !=i 的时候交换 ;
m = [[1,2,3],[4,5,6],[7,8,9]] #写成二维数组;
for i in range(3):
for j in range(i):
m[i][j],m[j][i]=m[j][i],m[i][j] # 3 维方阵交换3次; 数值为 0 、1、2;
print(m)
-----------------------------
1 4 7
2 5 8
3 6 9
总结:
# for 循坏的几种写法含义理解不深:
for i in lst:
for j in lst:
for i in lst;
for j in i:
# 优化方案:
# 1.对角线的取值,是否交换;
# 2.写成data写成 二维数组,否则会绕大湾子;
# 3.数组不建议进行二次索引,二次索引是建立在list中都是单个字符的情况;
方法3: 矩阵的打印;不打印对角线
lst1=[[1,2,3],[4,5,6],[7,8,9]]
for x in range(len(lst1)):
for y in range(len(lst1[x])):
if y>x: # 除去对角线的打印;
lst1[x][y],lst1[y][x]=lst1[y][x],lst1[x][y]
lst1
-----------------------------
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
方法3 enumerate() 函数的使用
enumerate() 函数的使用
enumerate是类似生成器的可迭代对象;
enumerate(sequence, [start=0])
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>>list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>>list(enumerate(seasons, start=1)) # 小标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
3.3 # 给定一个不规则矩阵(23)的方阵,求其转置矩阵(有点难为人)*
方法1: enumerate()函数写法;
lst=[[1,2,3],[4,5,6]]
for i,y in enumerate(lst[1],1):
print(i,y)
-------------------------
1 4
2 5
3 6
方法2:enumerate + append 方法 ;
matrix = [[1,2,3],[4,5,6]]
tm = []
for row in matrix:
print(row)
for i, col in enumerate(row):
if len(tm) < (i+1): #动态创建;
tm.append([])
tm[i].append(col)
print(tm)
----------------------------------------
[1, 2, 3]
[4, 5, 6]
[[1, 4], [2, 5], [3, 6]]
方法3:一此行开辟所有空间+列表解析式;
m = [[1,4],[2,5],[3,6]]
# tm = [[0]*2]*3 # 3*2
tm = [[0 for col in range(len(m))] for row in range(len(m[0]))] #开辟空间 ;列表解析式 效率更高;
count = 0
for i,row in enumerate(tm):
for j,col in enumerate(row):
tm[i][j] = m[j][i] #将m所有的元素搬到tm中;一次都少不了
count+ = 1
print(m)
print(tm)
print(count)
----------------------------------------
[[1, 4], [2, 5], [3, 6]]
[[1, 2, 3], [4, 5, 6]]
6
总结:
1. tm = [[0 for col in range(len(m))] for row in range(len(m[0]))] #开辟空间 ;列表解析式;
2. tm[i][j] = m[j][i] #将m所有的元素搬到tm中;一次都少不了
3. 不要盲目的下结论:append方法与for循坏迭代快慢比较:可能的原因:数据的规模大小,而不是append比for快;
方法3: append方法
m=[[1,2,3],[4,5,6]]
tm = []
count = 0
for row in m:
for i,col in enumerate(row):
if len(tm)<i+1: # m有i列就要为tm创建i行;
tm.append([])
tm[i].append(col)
count += 1
print(m)
print(tm)
print(count)
------------------------------------------
[[1, 2, 3], [4, 5, 6]]
[[1, 4], [2, 5], [3, 6]]
6
数字统计
3.4 # 随机产生10个数字【10,20】,统计重复的数字有几个;不重复的数字有几个,分别是什么?
#4.随机生成10个数字;统计重复和不重复数字的个数和值;
方法1:list count 实现方法
lst = []
for i in range(10):
lst.append(random.randint(1,20))
lst1 = []
m = 0
for i in range(10):
#print(lst[i],lst.count(lst[i]))
n = lst.count(lst[i])
if n>1 and lst[i] not in lst1:
lst1.append(lst[i])
m += 1
print('重复的数字有{}个,分别为{}'.format(m,lst1))
---------------------------------------------------------------
重复的数字有3个,分别为[14, 2, 13]
解法2:
import random
nums = []
for _ in range(10): # for循坏的i值可以为任意;包括符号
nums.append(random.randint(1,20))
print("Origin numbers = {}".format(nums))
print('-----------------------------------')
length = len(nums)
samenums = [] #记录相同的数字;
diffnums = [] #记录不同的数字;
states = [0]*length #记录不同的索引状态;
for i in range(length):
flag = False #假定没有重复;
if states[i] == 1:
continue
for j in range(i+1,length):
if states[j] == i:
continue
if nums[i] == nums[j]:
flag = True
states[j] = 1
if flag: #有重复;
samenums.append(nums[i])
states[i] = 1
else:
diffnums.append(nums[i])
print("Same numbers = {1},Counter={0}".format(len(samenums),samenums))
print("Different numbers = {1},Counter={0}".format(len(diffnums),diffnums))
print(list(zip(states,nums)))
-----------------------------------------------------------------------------------
Origin numbers = [1, 7, 5, 14, 10, 19, 8, 9, 10, 11]
-----------------------------------
Same numbers=[10],Counter=1
Different numbers=[1, 7, 5, 14, 19, 8, 9, 11],Counter=8
[(0, 1), (0, 7), (0, 5), (0, 14), (1, 10), (0, 19), (0, 8), (0, 9), (1, 10), (0, 11)]
总结:
1. for循坏的i值可以为任意;包括符号;
网友评论