定义二维列表:
方法一
a = [[i for i in range(10)] for j in range(10)] # 10行10列,每一行内容为[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a)
print('=' * 80)
b = [[0 for i in range(10)] for j in range(10)] # 10行10列,每一行内容为[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
print(b)
运行结果
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
====================================================================================================
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
方法二
c = []
for i in range(10):
c.append([j for j in range(10)])
print(c)
运行结果
[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]
字符串转换为变量
SNR50 = list()
SNR40 = list()
SNR30 = list()
SNR20 = list()
SNR10 = list()
SNR0 = list()
nmse = 2
for k in range(6):
# ('SNR'+ str(k * 10)).append(k) # 报错:AttributeError: 'str' object has no attribute 'append'
locals()[('SNR'+ str(k * 10))].append(nmse)
python 中元组和列表a[::-1]和a[:-1]的区别
# 例子:
a=(7,9,10,11)
b=[3,4,5,6]
a(::-1)=(11,10,9,7)
b[::-1]=[6,5,4,3]
# 从中可以看出(::-1)或[::-1]表示的是将元组或列表逆序
# 但是,
a(:-1)=(7,9,10)
b[:-1]=[3,4,5]
# (:-1)或[:-1]则表示的是将元组或列表进行切片,切片的规则是取元组或是列表除最后一位元素的切片
十进制转换其他进制
########### 方法一
# 转十六进制
n = int(input())
a= []
while n > 0:
if n % 16 < 10:
a.append(n % 16)
if n % 16 == 10:
a.append("A")
if n % 16 == 11:
a.append("B")
if n % 16 == 12:
a.append("C")
if n % 16 == 13:
a.append("D")
if n % 16 == 14:
a.append("E")
if n % 16 == 15:
a.append("F")
n = int(n / 16)
print(a[::-1])
# 转二进制
n = int(input())
a= []
while n > 0:
a.append(n % 2)
n = int(n / 2)
print(a[::-1])
# 转八进制
n = int(input())
a= []
while n > 0:
a.append(n % 8)
n = int(n / 8)
print(a[::-1])
########### 方法二
n = int(input())
print("{0:b}".format(n)) # 二进制
print("{0:o}".format(n)) # 八进制
print("{0:x}".format(n)) # 十六进制
入门训练
A+B问题
"""注意一行输入多个数据的写法"""
a, b = map(int, input().split()) # 多行输入
s = a + b
print(s)
a, b, c = map(int, input().split())
print('a = %d, b = %d, c = %d '% (a, b, c))
序列求和
"""用等差数列求和公式去写,用循环递归的方法会超时"""
# 序列求和,求1+2+3+...+n的值。
n = input()
n = int(n)
# 错误结果(0分)
s = n * 1 + n * (n-1)/2
print(int(s))
# 正确结果(100分)
s = int(n * 1 + n * (n-1)/2)
print(s)
圆的面积
"""pi可以通过math包导入,即 math.pi"""
# 给定圆的半径r,求圆的面积。输入包含一个整数r,表示圆的半径。输出一行,包含一个实数,四舍五入保留小数点后7位,表示圆的面积
import math
r = input()
s = int(r) * int(r) * math.pi
print('%.7f'% s)
Fibonacci数列
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
"""把a[i-1],a[i-2]求余以后相加再求余跟直接算出a[n]以后求余效果是一样的,小于10007的时候求余本来也就是他本身。
如果先求出Fibonacci值会运行超时"""
m = input()
f1, f2 = 1, 1
i = 2 # 前两项已经确定
while(i < int(m)):
i, f2, f1 = i + 1, (f2 + f1) % 10007, f2 # 此种方法不会超时
y = f2 - f2 // 10007 * 10007
print(y)
求素数
bound = int(input())
sum = 0
for n in range(2, bound):
# for i in range(2, n):
for i in range(2, int((n / 2) + 1)):
if n % i == 0:
break
else:
sum += n
print(sum)
注:for……else 的用法:见示例
示例1:
for i in range(5):
print(i)
else:
print("Testing")
运行结果
0
1
2
3
4
Testing
示例2:
for i in range(5):
print(i)
if i == 2:
break
else:
print("Testing")
运行结果
0
1
2
由示例1可知,当for……else 是一个整体,for循环正常结束后,才执行else语句。但(由示例2可知),当遇到break语句时,跳出for……else这个整体,两部分代码都不会执行。
基础练习
数列排序
"""注意:
1. 不确定输入个数的时候的写法,可以把他们放在 list 中。m 编程方法
2. print 默认输出一次换行一次,可以利用 end=' '是换行符变成空格符"""
# 数列排序
# 方法一:(简单方法)
n = int(input())
m = [i for i in map(int, input().split())]
m.sort() # 利用python自带函数功能进行排序
# print(m.sort())输出 None,因为此时输出值为 m.sort() 的返回值 None。
# m = m.sort()这样也是返回 None 值
for i in range(n):
print(m[i], end=' ') # 默认
# 方法二
n = int(input())
m = [i for i in map(int, input().split())]
a = 99999999999999
for i in range(n):
for j in range(n - 1):
if m[i] < m[j]:
t = m[i]
m[i] = m[j]
m[j] = t
for i in m:
print(i, end=' ')
十六进制转八进制
"""进制转换问题参考此网页
https://blog.csdn.net/Jerry_1126/article/details/82917014
利用oct()等方法进行输出时,存在数据类型前缀(0o是八进制,0x十六进制),
0b是二进制,不符合题目要求。改用format进行格式输出"""
# 十六进制转八进制
n = int(input())
a = list()
for i in range(n):
a.append(int(input(), 16)) # int("100", 8)表示 将输入的16进制数 向10进制转换
for j in a:
# print(oct(j)) # 输出0o71 0o4435274
print("{0:o}".format(j)) # 0表示第1个位置,:后面跟命令符。o表示八进制
十六进制转十进制
"""n = int(input(), 16) # 将输入的16进制数,转换成10进制数"""
# 十六进制转十进制
n = int(input(), 16) # 将输入的16进制数,转换成10进制数
print(n)
十进制转十六进制
"""注意:x为小写,输出的字母为小写,X为大写,输出的字母为大写。按照题目要求更改大小写"""
a = int(input())
s = "{0:X}".format(a)
print(s)
特殊回文数
"""运算中间加一句判断语句,可以节省大量运算时间,程序也不会超时"""
a = int(input())
for i in range(10000, 1000000):
if i < 100000:
w_w = int(i/10000)
w_g = int(i % 10)
if w_w != w_g : # 节省运行时间,加着一句话就可以使程序不超时
continue
w_q = int(i/1000) % 10
w_b = int(i/100) % 10
w_s = int(i/10) % 10
if w_w == w_g and w_q == w_s and w_w + w_q + w_b + w_s + w_g == a:
print(i)
else:
y_y = int(i/100000)
y_g = int(i % 10)
if y_y != y_g :
continue
y_w = int(i/10000)%10
y_s = int(i/10)% 10
if y_w != y_s:
continue
y_q = int(i/1000)% 10
y_b = int(i/100)% 10
if y_y == y_g and y_w == y_s and y_q == y_b and (y_y + y_w + y_q + y_b + y_s + y_g) == a:
print(i)
回文数
for i in range(1000,10000):
q_q = int(i / 1000)
q_g = int(i % 10)
if q_q != q_g:
continue
q_b = int(i / 100 % 10)
q_s = int(i / 10 % 10)
if q_q == q_g and q_b == q_s:
print(i)
特殊的数字
# 153是一个非常特殊的数,它等于它的每位数字的立方和,即153=1*1*1+5*5*5+3*3*3。
# 编程求所有满足这种条件的三位十进制数。
for i in range(100, 1000):
b_b = int(i / 100)
b_s = int(i / 10) % 10
b_g = int(i % 10)
if pow(b_b, 3) + pow(b_s, 3) + pow(b_g, 3) == i:
print(i)
杨辉三角形
"""注意题目要求,不能有多余的空格,方法一的分为0,有多于的行于空格"""
#
L = [[0 for i in range(34)] for i in range(34)]
L[0][0] = 1
n = int(input())
for i in range(n):
for j in range(i+1):
if i >= 1 and j >= 1: # >= 之间不能有空格
L[i][j] = L[i-1][j] + L[i-1][j-1]
if j == 0:
L[i][j] = 1
if i == j:
L[i][j] = 1
print(L[i][j], end=' ')
print('\n')
# 此种方法输出为:
>>> 4
1
1 1
1 2 1
1 3 3 1
# 方法二
L = [[0 for i in range(34)] for i in range(34)]
L[0][0] = 1
n = int(input())
for i in range(n):
for j in range(i+1):
if i >= 1 and j >= 1: # >= 之间不能有空格
L[i][j] = L[i-1][j] + L[i-1][j-1]
if j == 0:
L[i][j] = 1
# 与上一种方法的区别在每一行最后一个数字的输出
if j == i:
print(L[i][j])
else:
print(L[i][j], end=' ')
# 此种方法输出为
>>>4
1
1 1
1 2 1
1 3 3 1
# 没有多余的空格与换行符
查找整数
"""查找输入序列中某个数字第一次出现的位置,若果没没有出现,返回 -1 """
n = int(input())
m = [i for i in map(int, input().split())]
f = int(input())
for j in range(n):
if m[j] == f:
print(j+1)
break
elif j == n - 1:
print(-1)
数列特征
# 数列特征
n = int(input())
m = [i for i in map(int, input().split())]
print(max(m))
print(min(m))
print(sum(m))
字母图形
"""
样例输入
5 7
样例输出
ABCDEFG
BABCDEF
CBABCDE
DCBABCD
EDCBABC"""
# 方法一:
""" ord("A") # 查看ASCII码对应数字
chr(65) # 字符是 chr 不是char, 将65转换成 A"""
n, m = map(int, input().split())
# #print(ord("A")) # 查看ASCII码,输出 65
# #print(chr(65)) # 字符是 chr 不是char, 将65转换成 A
a = [chr(i) for i in range(65, 91)]
# #print(a[0])
t = [[0 for j in range(m)] for i in range(n)]
b = [i for i in range(26)]
for i in range(n):
for j in range(m):
for k in range(26):
if abs(i - j) == k:
t[i][j] = a[k]
if j == m - 1:
print(t[i][j])
else:
print(t[i][j], end='')
# 方法二
n, m = map(int, input().split())
for i in range(n):
t = 0
for j in range(m):
if (65 + i-j) >= 65:
t += 1
print(chr(65 + i-j), end='')
for x in range(m-t):
print(chr(66 + x), end='')
print()
01字串
"""以下两句话输出结果不同,05b表示字宽为5的二进制,不足5位则要高位补0
5b表示字宽为5的二进制,高位不补 0"""
for i in range(32):
print("{0:05b}".format(i))
print("{0:5b}".format(i))
闰年判断
"""给定一个年份,判断这一年是不是闰年。
当以下情况之一满足时,这一年是闰年:
1. 年份是4的倍数而不是100的倍数;
2. 年份是400的倍数。
其他的年份都不是闰年。"""
y = int(input())
if (y % 4 == 0 and y % 100 != 0) or y % 400 ==0:
print('yes')
else:
print('no')
阶乘计算
n = int(input())
p = 1
for i in range(n):
p *= (i + 1)
print(p)
高精度加法
a = int(input())
b = int(input())
c = a + b
print(c)
Huffuman树
"""
1. a.pop(index):删除列表a中index处的值,并且返回这个值.
2. del(a[index]):删除列表a中index处的值,无返回值. del中的index可以是切片,所以可以实现批量删除.
3. a.remove(value):删除列表a中第一个等于value的值,无返回."""
n = int(input())
a = [i for i in map(int, input().split())]
sum = 0
for i in range(len(a)-1):
a_min = min(a)
a.remove(a_min)
a_min2 = min(a)
a.remove(a_min2)
a.append(a_min + a_min2)
sum += a_min + a_min2
if len(a) == 1:
break
print(sum)
FJ的字符串
"""FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?"""
# 不要通过定义一个完整的数组,往数组里写字符串,这样占用太大内存。计算也超时。
N = int(input())
A = ""
for i in range(N):
B = A + chr(65+i) + A
A = B
print(B)
八皇后问题
cnt = 0
def eight_queen():
line = [None] * 8 # line存储可行的方案
f(line, 0)
def f(line, n):
global cnt
if n == 8:
cnt = cnt + 1
return
cur = [True] * 8 # 该列表指向一行的八个列。对于当前行,要根据前面的行,看看本行哪个地方可以放,一个一个进行枚举。True / False 表示当前行可不可以放。
for i in range(n): # 看看数据在前 n-1 行的,哪一个列上
cur[line[i]] = False # line[i], 表示在第 i 行的第 line[i] 列上有,该列就不能放置。
k = n - i # 行差
# 判断对角是否超出棋盘范围,没有则设为False,即对角不能放置 皇后
if line[i] + k < 8:
cur[line[i] + k] = False # line[i] + k 列
if line[i] - k >= 0:
cur[line[i] - k] = False
# 对可以放的进行枚举
for i in range(8):
if cur[i]:
line[n] = i # 第 n 行
f(line, n + 1)
if __name__ == '__main__':
eight_queen()
print(cnt)
报时助手
h, m = map(int, input().split())
pron = {0:'zero', 1:'one', 2:'two', 3:'three', 4:'four', 5:'five', 6:'six', 7:'seven', 8:'eight', 9:'nine', 10:'ten', 11:'eleven', 12:'twelve', 13:'thirteen', 14:'fourteen', 15:'fifteen', 16:'sixteen', 17:'seventeen', 18:'eighteen', 19:'nineteen', 20:'twenty', 30:'thirty', 40:'forty', 50:'fifty'}
def pro_num1(n):
if n > 20 and n != 30 and n != 40 and n != 50:
n_ge = n -int(n / 10) * 10
print(pron[int(n / 10) * 10],pron[n_ge], end=' ')
else:
print(pron[n], end=' ')
def pro_num2(n):
if n > 20 and n != 30 and n != 40 and n != 50 and n !=0:
n_ge = n -int(n / 10) * 10
print(pron[int(n / 10) * 10],pron[n_ge], end=' ')
elif n == 0:
print("o'clock")
else:
print(pron[n], end=' ')
pro_num1(h)
pro_num2(m)
回形取数
m, n = map(int, input().split())
s = []
for i in range(m):
s.append([j for j in map(int, input().split())])
if m < n:
minD = m
else:
minD = n
lenC = int((minD + 1) / 2)
for t in range(lenC):
if t == lenC - 1 and (minD + 1) % 2 == 0: # 最后一个循环,结束后将要跳出
if m < n: # 横向输出
for i in range(t,n - t): # 此处横向范围不同于下方的横向
print(s[t][i], end=' ')
else: # 纵向输出
for i in range(t, m - t):
print(s[i][t], end=' ')
else:
for i in range(t, m - t):
print(s[i][t], end=' ')
for i in range(t + 1, n - t):
print(s[m - 1 -t][i], end=' ')
for i in range(m - 2 - t, t - 1, -1):
print(s[i][n - 1 - t], end=' ')
for i in range(n - 2 - t, t, -1):
print(s[t][i], end=' ')
龟兔赛跑预测
# 兔子 v1
# 乌龟 v2
v1, v2, t, s, L = map(int, input().split())
R_s = 0
T_s = 0
T_int = int(L / v2)
for i in range(1, T_int + 1):
R_s += v1
T_s += v2
if R_s - T_s >= t and R_s < L:
R_s = R_s - s * v1
if R_s >= L and i != T_int: # i != T_int 不加这句话,相等时也满足
print("R")
print(i)
break
if i == T_int and T_s == R_s:
print("D")
print(i)
elif i == T_int and T_s > R_s:
print("T")
print(i)
芯片测试
n = int(input())
##print(n)
a = []
b = []
for i in range(n):
a.append([i for i in map(int, input().split())])
# 每一列,多余一般测试为好芯片即为好芯片
for i in range(n):
flag = 0
for j in range(n):
if a[j][i] == 1:
flag += 1
if flag >= int((n + 1) / 2):
b.append(i + 1)
##print(b)
b.sort()
for t in range(len(b)):
print(b[t], end=" ")
Sine之舞
def An(n):
for i in range(1, n + 1):
if i != n:
print("sin(", i, sep='', end='')
if i % 2 == 0:
print("+",end='')
else:
print("-",end='')
else:
print("sin(", i, sep='', end='')
for j in range(1, n + 1):
print(')', end='')
return '' # 必须写,不然返回值就变成了 None
def Sn(n):
for i in range(n - 1):
print('(', end='')
for i in range(1, n + 1):
print(An(i),"+",(n - i + 1), sep='', end='')
if n - i + 1 != 1:
print(')', end='')
n = int(input())
Sn(n)
递归斐波那契数列
"""递归斐波那契额数列"""
def fib(n):
if n == 1 or n == 2:
return 1
else:
return fib(n - 1) + fib(n - 2)
print(fib(3))
汉诺塔递归函数
# A: source, B: target, C: helper
def hanoi(n, source, target, helper): # move n Disk from A to B with the help of B
if n == 1: # 边界条件
moveSingleDisk(source, target)
else:
hanoi(n - 1, source, helper, target) # move n-1 Disk from A to C with the help of B
moveSingleDisk(source, target) # 完成一个圆盘任务,其余仿照操作
hanoi(n - 1, helper, target, source) # move n-1 Disk from C to B with the help of A
def moveSingleDisk(source, target):
disk = source[0].pop() # source[0]是一个列表[3, 2, 1]
print("moving " + str(disk) + " from " + source[1] + " to " + target[1], sep=' ')
target[0].append(disk)
if __name__ == "__main__":
A = ([3, 2, 1], "A") # 3个圆盘,数越大代表圆盘越大
B = ([], "B")
C = ([], "C")
hanoi(len(A[0]), A, B, C)
数的读法
"""
该算法并非本人想出来,转载于另一位博客大神,
链接:https://blog.csdn.net/qq_37962204/article/details/79716058
"""
# 该程序蓝桥杯评分系统给 100 分, 但存在bug, 105010 并不能正确读出。
n = int(input())
a = ['ling', 'yi', 'er', 'san', 'si', 'wu', 'liu', 'qi', 'ba', 'jiu']
b = ['shi', 'bai', 'qian', 'wan', 'yi']
res = ['' for i in range(20)]
i, j = 0, 0
l = [0, 0]
while n:
k, n = n % 10, int(n / 10)
if k:
if i >= 4 and l[int(i / 4) - 1] == 0:
l[int(i / 4) - 1] = 1
res[j], j = b[int(i / 4) + 2], j + 1
if i % 4:
res[j], j = b[int(i % 4) - 1], j + 1
res[j] = a[k]
j += 1
elif j > 0 and res[j - 1] != a[0]:
res[j], j = a[0], j + 1
i += 1
if res[j - 1] != 'yi' or j <= 1 or res[j - 2] != 'shi': # 控制第一位输出
# 1.高位为一时,不输出。
# 2.控制输出个位数。
# 3.res[j - 2] != 'shi'可以控制百位为1时,可以输出一,如123,前两个都不满足,但 res[j - 2] != 'shi'满足,所以能够正确输出。
print(res[j - 1], end=' ')
for i in range(j - 2, -1, -1): # 从第二位输出
print(res[i], end=' ')
完美的代价
N = int(input())
s = list(input())
count = 0 # 统计交换次数
flag = 0
i = 0
a = True
len = N - 1
while i < len:
if a == False:
break
for j in range(len, i - 1, -1):
if i == j:
# N % 2 == 0时,说明是偶数,在i == j 时,才找到相同的,说明该数为单个存在,不可能对称
# 当 N 为奇数时,首先执行下面 flag = 1的语句。如果再次进入到这儿,说明又一次,在i == j 时,
# 才找到相同的,即单个存在数字不止一个,则根据 flag == 1 判断本串字符串不可能对称。
if N % 2 == 0 or flag == 1: # 如果 N 是奇数,第一次进不来,因为 flag = 0
print('Impossible')
a = False
break
flag = 1 # 标志位。到这一步,说明 N % 2 == 1 ,标志改数字为单个存在(只能把它放在中间位置)
count += N // 2 -i # 计算该数字移到中间位置所需要的交换次数
elif s[i] == s[j]:
for k in range(j, len):
s[k], s[k + 1] = s[k + 1], s[k]
count += 1
len -= 1
break
i += 1
if a == True:
print(count)
未完待续…………