Week 3:转置矩阵、数值统计、列表解析式和排序法

一、转置矩阵

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)

猜你喜欢

转载自blog.csdn.net/weixin_42196568/article/details/81636153
今日推荐