一、转置矩阵
1 2 3
4 5 6
< - >
1 4
2 5
3 6
1、方法一:用 enumerate 函数(返回iterable的元素索引及值),行转列
matrix=[[1,2,3],[4,5,6]]
transposed_matrix=[]
for x in matrix:
for i,col in enumerate(x):
if len(transposed_matrix)<i+1:
transposed_matrix.append([])
transposed_matrix[i].append(col)
print(transposed_matrix)
2、方法二:一次性用效率比for循环更高的列表解析式(列表推导式)创建好目标矩阵所需空间,再根据索引规律填值;
matrix=[[1,2,3],[4,5,6]]
transposed_matrix=[[0 for i in range(len(matrix))] for j in range(len(matrix[0]))]
for i in range(len(matrix[0])):
for j in range(len(matrix)):
transposed_matrix[i][j]=matrix[j][i]
print(transposed_matrix)
方法二在数据规模大的时候效率优势更明显(大于4x4时优势开始明显),一次性开辟好空间比反复append要效率高
二、统计一个随机数字列表的重复情况
1、方法一:用列表,并尽可能减少比较的次数,此算法效率较高
import random
nums=[random.randrange(21) for _ in range(10)]
print(nums)
length=len(nums)
status=[0]*length
same=[]
diff=[]
for i in range(length):
if status[i]:
continue
c=0
for j in range(i+1,length):
if status[j]:
continue
if nums[i]==nums[j]:
status[j]=1
c+=1
status[i]=1+c
if status[i]:
same.append((nums[i],status[i]))
else:
diff.append(nums[i])
print("same numbers and count:",same)
print("different numbers:",diff)
2、方法二:用字典
import random
nums=[random.randrange(21) for _ in range(10)]
print(nums)
d={}
for i in nums:
d[i]=d.get(i,0)+1
print(d)
三、用列表解析式(列表推导式)简写部分训练题
1、九九乘法表
[print("{}*{}={:<{}}".format(j,i,i*j,3 if j==1 else 4),end='\n' if i==j else '') for i in range(1,10) for j in range(1,i+1)]
2、打印ID
#非解析式方法
import random
alpha=bytes(range(97,123)).decode()
s1=''
for i in range(1,101):
s1=str(i).zfill(4)
s2=''
for _ in range(10):
s2+=random.choice(alpha)
print("{}.{}".format(s1,s2))
#列表解析式,random.choice()嵌套了一个for循环
import random
[print('{:>04}.{}'.format(i,''.join([random.choice(chr(random.randint(97,122))) for _ in range(10)]))) for i in range(1,101)]
#列表解析式,采用random.choices()
import random
alpha=bytes(range(97,123)).decode()
[print('{:>04}.{}'.format(i,''.join(random.choices(alpha,k=10)))) for i in range(1,101)]
四、排序算法
1、冒泡排序
l=[9,3,5,6,4,8,7,1,2]
for i in range(8):
count_swap=0
for j in range(8-i):
if l[j]>l[j+1]:
l[j],l[j+1] = l[j+1],l[j]
count_swap+=1
if count_swap==0:
break
print(l)
2、选择排序
l=[9,3,5,6,4,8,7,1,2]
for i in range(8):
m=i
for j in range(i+1,9):
if l[m]<l[j]:
m=j
l[i],l[m]=l[m],l[i]
print(l)
优化:可在一趟 j 循环中,同时把极大值、极小值找出并置于两端,提高效率
l=[1,9,8,5,6,7,4,3,2]
for i in range(5):
m=i
s=8-i
for j in range(i,9-i):
if l[m]<l[j]:
m=j
if l[s]>l[j]:
s=j
if i!=m:
l[i],l[m]=l[m],l[i]
if s==i:
s=m
if 8-i!=s:
l[8-i],l[s]=l[s],l[8-i]
print(l)