【PTA|Python】浙大版《Python 程序設(shè)計》題目集:第六章
第六章
6-1 輸入列表,求列表元素和(eval輸入應(yīng)用) (10 分)
題目
在一行中輸入列表,輸出列表元素的和。
輸入格式:
?一行中輸入列表。
?
輸出格式:
?在一行中輸出列表元素的和。
?
輸入樣例:
?[3,8,-5]
?
輸出樣例:
?6
?
解答
提交代碼 - 1
lst=eval(input())
print(eval('+'.join('%s' %id for id in lst)))
提交代碼 - 2
print(sum(eval(input())))

6-2 一幫一 (15 分)
題目
“一幫一學(xué)習(xí)小組”是中小學(xué)中常見的學(xué)習(xí)組織方式,老師把學(xué)習(xí)成績靠前的學(xué)生跟學(xué)習(xí)成績靠后的學(xué)生排在一組。
本題就請你編寫程序幫助老師自動完成這個分配工作,即在得到全班學(xué)生的排名后,在當(dāng)前尚未分組的學(xué)生中,將名次最靠前的學(xué)生與名次最靠后的「異性學(xué)生」分為一組。
輸入格式:
?輸入第一行給出正偶數(shù)N(≤50),即全班學(xué)生的人數(shù)。此后N行,按照名次從高到低的順序給出每個學(xué)生的性別(0代表女生,1代表男生)和姓名(不超過8個英文字母的非空字符串),其間以1個空格分隔。這里保證本班男女比例是1:1,并且沒有并列名次。
?
輸出格式:
?每行輸出一組兩個學(xué)生的姓名,其間以1個空格分隔。名次高的學(xué)生在前,名次低的學(xué)生在后。小組的輸出順序按照前面學(xué)生的名次從高到低排列。
?
輸入樣例:
?8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda
?
輸出樣例:
?Amy Jack
Tom Linda
Bill Maya
Cindy John
?
解答
#!/usr/bin/python3
# 存儲所有學(xué)生的名字 根據(jù)名次排序
students = []
# 存儲女孩的名字 根據(jù)名次排序
girl = []
# 存儲男孩的名字 根據(jù)名次排序
boy = []
n = int(input())
for i in range(n):
student = input().split()
students.append(student[1])
if student[0] == '0':
boy.append(student[1])
else:
girl.append(student[1])
# 遍歷前4名
for i in range(n//2):
# 如果是男孩
if students[i] in boy:
# 找到該孩子在男孩中的名次 與index對應(yīng) 比如在第1名index為0
# 男孩中的第一個應(yīng)該與女孩中的最后一個組合
# 所以 男孩的索引為index 那么女孩的索引就是-1-index
# -1表示最后一個 再-index表示往前幾個
# 例如:-1-1 表示再最后一個的基礎(chǔ)上再前進2個元素
index = boy.index(students[i])
print("{} {}".format(students[i], girl[-1-index]))
else:
index = girl.index(students[i])
print("{} {}".format(students[i], boy[-1-index]))

6-3 列表或元組的數(shù)字元素求和 (20 分)
題目
求列表中數(shù)字和,列表中嵌套層次不限2層
輸入格式:
?在一行中輸入列表或元組
?
輸出格式:
?在一行中輸出數(shù)字的和
?
輸入樣例: 在這里給出一組輸入。例如:
?[11,2,[3,7],(68,-1),"123",9]
?
輸出樣例: 在這里給出相應(yīng)的輸出。例如:
?99
?
解答
注意題目中只需要求的是數(shù)字和
例子:[11,2,[3,7],(68,-1),"123",9] 中“123”屬于字符串,不再計算范圍內(nèi)
正確計算是:11+2+3+7+68+(-1)+9=99
編寫代碼時注意不要將字符串也納入計算范圍內(nèi)了,注意提取正確的數(shù)字,避開字符串(開始還沒有注意到)
#!/usr/bin/python3
s = input()
# s為字符串
# 首先將[]()替換
s = s.replace('[', '')
s = s.replace(']', '')
s = s.replace('(', '')
s = s.replace(')', '')
# 注意”123“屬于字符串 不屬于數(shù)字 我們是不需要的
s2 = ""
# 記錄”的個數(shù)
count = 0
# 遍歷s
# 統(tǒng)計“的個數(shù) 如果為偶數(shù)且不為” 說明為數(shù)字
for i in s:
if i == '"':
count += 1
if count % 2 == 0 and i != '"':
s2 += i
# 替換逗號
s2 = s2.replace(',', ' ')
# 注意可能兩個數(shù)中間原來有兩個逗號 替換后就有兩個空格
# 再利用split() 提取元素 轉(zhuǎn)化為list類型
s2 = s2.split()
ans = 0
# 遍歷s2 list類型
for i in s2:
ans += int(i)
print(ans)

6-4 列表數(shù)字元素加權(quán)和(1) (40 分)
題目
輸入一個嵌套列表,嵌套層次不限,根據(jù)層次,求列表元素的加權(quán)和。第一層每個元素 的值為:元素值1,第二層每個元素的值為:元素值2,第三層每個元素的值為:元素值*3, ...,以此類推!
輸入格式:
?在一行中輸入列表
?
輸出格式:
?在一行中輸出加權(quán)和
?
輸入樣例: 在這里給出一組輸入。例如:
?[1,2,[3,4,[5,6],7],8]
?
輸出樣例: 在這里給出相應(yīng)的輸出。例如:
?72
?
解答
有幾個需要注意的地方:
其中的數(shù)字可以為兩位數(shù)、三位數(shù) 數(shù)字也可以為負數(shù)
提供的一些測試數(shù)據(jù)
[1] [-1] [1,[19,1],2] ......
踩坑:如果開始以字符串讀取,再逐一讀取字符,需要注意每次讀取只得到一個字符。比如字符串“234”,讀取是2、3、4 這個地方易錯
# 以字符串類型讀入數(shù)據(jù)
s = input()
# count:統(tǒng)計[、]字符的個數(shù) 遇到[ +1 遇到] -1
count = 0
# ans:最后結(jié)果
ans = 0
# 字符串索引
index = 0
# 判斷一個數(shù)是負數(shù)還是正數(shù)
flag = 1
# 遍歷字符串
while index < len(s):
# 遇到[ 層級+1
if s[index] == '[':
count += 1
# 遇到] 層級-1
elif s[index] == ']':
count -= 1
# 遇到 '-' 說明之后的數(shù)字為負數(shù)
elif s[index] == '-':
flag = -1
# 如果是一個數(shù)字 則需要判斷后面是否接著為數(shù)字
# 如果是 還得拼接數(shù)字 比如23
# 因為是逐個字符讀取
# 每次只讀一個字符
# 讀到2時 還需要判斷后面是否還是數(shù)字
# 如果是 需要拼接為23
elif s[index].isdigit():
index2 = index
num = 0
while s[index2].isdigit():
num = num*10+int(s[index2])
index2 += 1
# 更新index
index = index2-1
# 更新ans 注意正負號
ans = ans+count*num*flag
# 最后需要將flag再次設(shè)置為1
flag = 1
index += 1
print(ans)

6-5 列表元素個數(shù)的加權(quán)和(1) (40 分)
題目
輸入一個嵌套列表,嵌套層次不限,根據(jù)層次,求列表元素的加權(quán)個數(shù)和。第一層每個元素算一個元素,第二層每個元素算2個元素,第三層每個元素算3個元素,第四層每個元素算4個元素,...,以此類推!
輸入格式:
?在一行中輸入一個列表。
?
輸出格式:
?在一行中輸出加權(quán)元素個數(shù)值。
?
輸入樣例: 在這里給出一組輸入。例如:
?[1,2,[3,4,[5,6],7],8]
?
輸出樣例: 在這里給出相應(yīng)的輸出。例如:
?15
?
解答
在上一題思路上簡化即可
s = input()
count = 0
ans = 0
index = 0
while index < len(s):
if s[index] == '[':
count += 1
elif s[index] == ']':
count -= 1
# elif s[index]=='-':
# flag=-1
elif s[index].isdigit():
index2 = index
while s[index2].isdigit():
index2 += 1
index = index2-1
ans = ans+count
index += 1
print(ans)

第6章-6 求指定層的元素個數(shù) (40 分)
題目
輸入一個嵌套列表,再輸入層數(shù),求該層的數(shù)字元素個數(shù)。
輸入格式:
?第一行輸入列表 第二行輸入層數(shù)
?
輸出格式:
?在一行中輸出元素個數(shù)
?
輸入樣例: 在這里給出一組輸入。例如:
?[1,2,[3,4,[5,6],7],8] 3
?
輸出樣例: 在這里給出相應(yīng)的輸出。例如:
?2
?
解答
s = input()
n=int(input())
count = 0
ans = {}
index = 0
while index < len(s):
if s[index] == '[':
count += 1
elif s[index] == ']':
count -= 1
elif s[index].isdigit():
index2 = index
while s[index2].isdigit():
index2 += 1
index = index2-1
ans[count]=ans.get(count,0)+1
index += 1
print(ans[n])

6-7 找出總分最高的學(xué)生 (15 分)
題目
給定N個學(xué)生的基本信息,包括學(xué)號(由5個數(shù)字組成的字符串)、姓名(長度小于10的不包含空白字符的非空字符串)和3門課程的成績([0,100]區(qū)間內(nèi)的整數(shù)),要求輸出總分最高學(xué)生的姓名、學(xué)號和總分。
輸入格式:
?輸入在一行中給出正整數(shù)N(≤10)。隨后N行,每行給出一位學(xué)生的信息,格式為“學(xué)號 姓名 成績1 成績2 成績3”,中間以空格分隔。
?
輸出格式:
?在一行中輸出總分最高學(xué)生的姓名、學(xué)號和總分,間隔一個空格。題目保證這樣的學(xué)生是唯一的。
?
輸入樣例:
?5 00001 huanglan 78 83 75 00002 wanghai 76 80 77 00003 shenqiang 87 83 76 10001 zhangfeng 92 88 78 21987 zhangmeng 80 82 75
?
輸出樣例:
?zhangfeng 10001 258
?
解答
n = int(input())
maxSumGrades = 0
maxSumGradesIndex = 0
students = []
for i in range(n):
student = list(input().split())
sumGrades = 0
for j in range(2, 5):
sumGrades += int(student[j])
if sumGrades > maxSumGrades:
maxSumGrades = sumGrades
maxSumGradesIndex = i
students.append(student)
print("{} {} {}".format(students[maxSumGradesIndex][1], students[maxSumGradesIndex][0], maxSumGrades))

6-8 輸出全排列 (20 分)
題目
輸入整數(shù)n(3<=n<=7),編寫程序輸出1,2,...,n整數(shù)的全排列,按字典序輸出。
輸入格式:
?一行輸入正整數(shù)n。
?
輸出格式:
?按字典序輸出1到n的全排列。每種排列占一行,數(shù)字間無空格。
?
輸入樣例: 在這里給出一組輸入。例如:
?3
?
輸出樣例: 在這里給出相應(yīng)的輸出。例如:
?123
132
213
231
312
321
?
解答
1-n的全排列(3<=n<=7) 最小數(shù)一定是:123..45..n 最大數(shù)是:n..54...321 思路(暴力循環(huán)):
從123...n 到 n...321 依次遍歷 對其進行set操作 當(dāng)set(num)==set("123...n")時 說明是符合條件的全排列
n = int(input())
ls = [str(i) for i in range(1, n+1)]
s = "1234567"
# beg=123...n
beg = int(s[:n])
# end=n...321
end = int(s[n-1::-1])
for x in range(beg, end+1):
if set(str(x)) == set(ls):
print(x)

結(jié)語
文章僅作為學(xué)習(xí)筆記,記錄從0到1的一個過程
希望對您有所幫助,如有錯誤歡迎小伙伴指正~
