苏州大学历年真题及推荐习题总结

本文整理了苏州大学Python课程的上机常用代码、习题及历年真题,涵盖矩阵运算、字符串处理、文件操作、素数判断、算法实现等多个方面,旨在帮助学生巩固Python基础并提升编程能力。
摘要由CSDN通过智能技术生成

 

目录

上机常用代码

(1) 输入代码

(2) 矩阵乘法 (np.dot(A, B))

def matrixMul(A, B):
    if len(A[0]) == len(B):  # A列数=B行数
        res = [[0] * len(B[0]) for i in range(len(A))]  # 生成 A行 x B列 的0矩阵
        for i in range(len(A)):
            for j in range(len(B[0])):
                for k in range(len(B)):
                    res[i][j] += A[i][k] * B[k][j]
        return res
    return ("输入矩阵有误!")
    
matrixMul(mat1, mat2)
Out[13]: [[19, 22], [43, 50]]
    
mat1
Out[14]: [[1, 2], [3, 4]]

mat2
Out[15]: [[5, 6], [7, 8]]

(2.2) 矩阵转置

matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]

list(zip(*matrix))
Out[34]: [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
    
matrix
Out[42]: [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

[[row[i] for row in matrix] for i in range(4)]
Out[43]: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]

(2.3) 获得矩阵对角线元素

(1) 从左下向右上的对角线

B = [[0]*m for i in range(2*m-1)]
row = 2*m - 1

dic = collections.defaultdict(list)
for i,j in itertools.product(range(m), range(m)):
    dic[i - j].append(A[m-i-1][j])
    
# 法2
def nextitem():
    for j in range(2*m-1):
        j = 0
        while 0 <= i < m or 0 <= j < m:
            if 0<=i<m and 0<=j<m:
                yield A[i][j]
             i -= 1
             j += 1

nextnum = nextitem()
cur = 1
for i in range(2*m-1):
    for j in range(cur):
        B[i].append(next(nextnum))
	B[i].extend([0]*(m-cur))
	if i < m - 1:
        cur += 1
    else:
        cur -= 1
return B

(2) 从左上向右下的对角线

B = [[0]*m for i in range(2*m-1)]
row = 2*m - 1

dic = collections.defaultdict(list)
for i,j in itertools.product(range(m), range(m)):
    dic[i - j].append(A[i][j])
    
# 法2
m, n = len(mat), len(mat[0])
tmp = []
for line in range(m+n-1):
    i, j = m-1-line, 0
    tmp.clear()
    while j < n:
        if 0 <= i < m and 0 <= j < n:
            tmp.append(mat[i][j])
            i += 1
            j += 1
            print(tmp)

(3) 生成 nxn 的 空矩阵

# 生成 nxn 的 空矩阵
res = [[] for i in range(0, n)]

(4) 字典排序

# 按value排序(降序),如果value相同则按key排序(字典序升序)
freq = sorted(freq.items(), key=lambda x:(-x[1], x[0]))

(5) 统计列表中所有元素出现的频率

from collections import Counter

a = "i love love you you"

dict( Counter(list(a.split())) )

Out[103]: {'i': 1, 'love': 2, 'you': 2}

或者:

from collections import defaultdict
frequences = defaultdict(int)
print(frequences)
Out[37]: defaultdict(int, {})

for e in a.split():
    frequences[e] += 1
    
frequences
Out[39]: defaultdict(int, {'i': 1, 'love': 2, 'you': 2})
    
s + t - s
Out[112]: Counter({'c': 1, 'b': 2, 'a': 1, 'd': 1})
list((s + t - s).elements())
Out[115]: ['c', 'b', 'b', 'a', 'd']

(6) list和set相互转换

set([1,2,3,4,4,5,5])
{1,2,3,4,5}
list(set([1,2,3,4,5,5]))
[1,2,3,4,5]

(7) 列表转整数

a = [1,2,3]

int("".join(list(map(str, a))))
Out[109]: 123

(8) 数字字符串 转整数

int('0e00', 16)    # 按照16进制转换成10进制
int('001', 2)      # 按照二进制方式转换成10进制
int('012', 8)      # 按照八进制方式转换成10进制

img

(9) 读取二进制文件

def main():
    res = [random.randrange(0, 9999, 1) for i in range(0, 32)]
#    print(res)
    
#    with open('./file/2010.txt', 'rb+') as f:
#        for i in res:
#            s = struct.pack('i', i)
#            f.write(s)
    
    # 写多少数据,一定要弄清楚
    len1 = len(res)
    nums = []
    with open('./file/2010.txt', 'rb+') as f:
        for i in range(len1):
            data = f.read(4)
            elem = struct.unpack('i', data)[0]
            nums.append(elem)
   
    # 按照 16进制 转换成 10进制        
    nums.sort(reverse=True)
    
    print("数据:", nums)

(9.1) 读二进制文件

def read_data():
    data = []
    with open('./file/file_2017_2.txt', 'rb') as f:
        num = f.read(4)
        while num:
            data.append(int.from_bytes(num, byteorder='little'))
            num = f.read(4)
    return data

(10) 判断素数 和 埃氏筛选法

def is_prime(num):
    if num < 2:
        return False    
    top = int(math.sqrt(num))
    i = 2
    while i <= top:
        if num % i == 0:
            return False
        i = i + 1        
    return True

# 埃氏筛选法
def judge():
    n = int(input())
    res = 0
    
    is_prime = [True]*(n+1)
    is_prime[0] = is_prime[1] = True
       
    # 筛选出所有素数 
    primes = []
    for i in range(2, n+1):
        if is_prime[i]:
            primes.append(i)
            j = 2*i
            while j <= n:             # 将 i 的倍数全部划去
                is_prime[j] = False
                j += i         
    
    for i in range(2, n - 1):
        if is_prime[i] and is_prime[i+2]:
            res += 1
    print(res)

judge()

(11) 最大公约数

def gcd(num1, num2):
    if num1 < num2:
        num1, num2 = num2, num1
    
    while (num1 % num2):
        temp = num1 % num2
        num1 = num2
        num2 = temp
        
    return num2

(12) format格式化输出

    for i in range(0, wlen):
        print('{0:8}'.format(ascii_words[i]), end='')
        if (i+1) % 10 == 0:
            print('')

img

img

(13) 全排序

def permute(L):
    if not L:
        return [L]
    else:
        res = []
        for i in range(len(L)):
            # 任一元素 + 剩余n-1个元素的全排序
            rest = L[:i] + L[i+1:]
            for x in permute(rest):
                res.append(L[i:i+1] + x)
        return res
        

permute([1,2,3])
Out[9]: [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]

或者:

def perm(L, cur):
    if cur == 3:
        print(L)
        return
    for i in range(1, 4):
        if not vis[i]:
            L[cur] = i
            vis[i] = True
            perm(L, cur + 1)
            vis[i] = False            
            

L = [0 for i in range(0, 3)]
vis = [0 for i in range(0,10)]
            
perm(L, 0)
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

(13) 插入排序

# -*- coding: utf-8 -*-
import random

# 找插入位置,使L仍保持升序
def find_insert_index(L, t):
    for i, x in enumerate(L):
        if x > t:
            return i
    return len(L)

A = [random.randint(0, 100) for i in range(10)]
print(A)
L = []
for x in A:
    i = find_insert_index(L, x)
    L.insert(i, x)
print(L)

(14) 删除list里面的重复元素 (位置不变)

l1 = ['b','c','d','c','a','a']
l2 = sorted(set(l1),key=l1.index)
print(l2)

l1 = ['b','c','d','c','a','a']
l2 = []
for i in l1:
    if not i in l2:
        l2.append(i)
print(l2)

(15) 遍历列表时删除元素的正确做法

21.Python-遍历列表时删除元素的正确做法
遍历在新在列表操作,删除时在原来的列表操作
a = [1,2,3,4,5,6,7,8]
print(id(a))
print(id(a[:]))
for i in a[:]:
    if i<5:
        a.remove(i)
    print(a)
print('-----------')
print(id(a))

(16) 集合操作

# 集合操作
a_set = set([1,2,3,4,7,8])
b_set = set([8,9,10,11,12,13])

print(a_set | b_set)       # 并集
print(a_set.union(b_set))  # 并集
print(a_set & b_set)       # 交集
print(a_set.intersection(b_set))  # 交集
print(a_set.difference(b_set))    # 差集
print(a_set - b_set)

print(a_set.symmetric_difference(b_set))   # 对称差
print(a_set ^ b_set)      # 对称差
{1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13}
{1, 2, 3, 4, 7, 8, 9, 10, 11, 12, 13}
{8}
{8}
{1, 2, 3, 4, 7}
{1, 2, 3, 4, 7}
{1, 2, 3, 4, 7, 9, 10, 11, 12, 13} n0
{1, 2, 3, 4, 7, 9, 10, 11, 12, 13}

(17) 分割连续字符串

data = 'TTTTThhiiiis isssss a   tesssst CAaaa as'

[i+j for i,j in re.findall(r'([a-zA-Z\s])(\1*)', data)]
Out[47]: 
['TTTTT', 'hh', 'iiii', 's', ' ', 'i', 'sssss', ' ', 'a', '   ', 't', 'e', 'ssss', 't',' ','C','A','aaa',' ','a','s']

data = '5T2h4is i5s a3 te4st CA3a as10Z'

re.findall('(\d*)([a-zA-Z\s])', data)
Out[50]: 
[('5', 'T'),('2', 'h'),('4', 'i'),('', 's'),('', ' '),('', 'i'),('5', 's'),('', ' '),
 ('', 'a'),('3', ' '),('', 't'),('', 'e'),('4', 's'),('', 't'),('', ' '),('', 'C'),
 ('', 'A'),('3', 'a'),('', ' '),('', 'a'),('', 's'),('10', 'Z')]

(18) 用 字符串 分割字符串

s = 'iloveappleclass'

s.partition('apple')
Out[80]: ('ilove', 'apple', 'class')

(19) maketrans, translate 【字符串对应地转换】

table = ''.maketrans('abcdef123', 'uvwxyz@#$')
s = 'Python is a greate programming language. I like it!'
s.translate(table)
Out[92]: 'Python is u gryuty progrumming lunguugy. I liky it!'

(20) 日期计算

def staytime(etc_info):
    # 计算停留时间
    # 2016-06-11#21:48:50 时间格式
    in_time = datetime.datetime.strptime(etc_info[1], "%Y-%m-%d#%H:%M:%S")
    out_time = datetime.datetime.strptime(etc_info[2].strip(), "%Y-%m-%d#%H:%M:%S")
    delta = (out_time - in_time).seconds

(21) 方差

var = sum([(num - ave)**2 for num in nums]) / len(nums)

苏大python习题

1. 给定整数m和n,如果m和n都大于1,则判定m和n是否互质,并返回判定结果。

  相关说明
输入条件 输入参数m和n是整数。大小关系未知。
输出要求 如果m和n中任何一个小于或等于1,则返回None,否则判定两数是否互质。 如果m和n互质,则返回布尔值True,否则返回布尔值False。
其他要求 将代码写入函数func1

测试用例:

输入 返回
2,3 True
4,8
  • 6
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值