如果你對Python中的字典和集合的使用還不是很熟悉,這兩篇文章或許能提供一些幫助:
Python數(shù)據(jù)容器之字典(dict)
Python數(shù)據(jù)容器之集合(set)
7-1 sdut-查驗(yàn)身份證
一個(gè)合法的身份證號碼由17位地區(qū)、日期編號和順序編號加1位校驗(yàn)碼組成。校驗(yàn)碼的計(jì)算規(guī)則如下:
首先對前17位數(shù)字加權(quán)求和,權(quán)重分配為:{7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}
;然后將計(jì)算的和對11取模得到值Z;最后按照以下關(guān)系對應(yīng)Z值與校驗(yàn)碼M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
現(xiàn)在給定一些身份證號碼,請你驗(yàn)證校驗(yàn)碼的有效性,并輸出有問題的號碼。
驗(yàn)證身份證合法性的規(guī)則:(1)前17位是否全為數(shù)字;(2)最后1位校驗(yàn)碼計(jì)算準(zhǔn)確。
輸入格式:
輸入第一行給出正整數(shù)N(≤100)表示:輸入的身份證號碼的個(gè)數(shù)。
隨后N行,每行給出1個(gè)18位身份證號碼。
輸出格式:
按照輸入的順序每行輸出1個(gè)有問題的身份證號碼。
如果所有號碼都正常,則輸出All passed
。
輸入樣例1:
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
輸出樣例1:
12010X198901011234
110108196711301866
37070419881216001X
輸入樣例2:
2
320124198808240056
110108196711301862
輸出樣例2:
All passed
代碼:
W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
Z = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
M = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
dic = dict(zip(Z, M))
flag = 1
n = int(input())
for i in range(n):
id = input()
if not id[0: 17].isdigit():
print(id)
flag = 0
else:
cnt = 0
for i in range(17):
cnt += int(id[i])*W[i]
if dic[cnt % 11] != id[-1]:
print(id)
flag = 0
if flag == 1:
print("All passed")
7-2 sdut-統(tǒng)計(jì)兩個(gè)字符串中相同的字符個(gè)數(shù)
輸入字符串A、字符串B,求在字符串A、字符串B中相同的字符個(gè)數(shù)。
輸入格式:
第一行輸入,表示字符串A。
第二行輸入,表示字符串B。
輸出格式:
在一行內(nèi),輸出字符串A、B中相同字符的個(gè)數(shù)。
輸入樣例:
AEIOU
HELLO World!
輸出樣例:
在這里給出相應(yīng)的輸出。例如:
2
代碼:
st1 = set(input())
st2 = set(input())
print(len(st1 & st2))
7-3 sdut-圖的字典表示
現(xiàn)在用PYTHON的數(shù)據(jù)結(jié)構(gòu)表示圖。圖中有若干個(gè)頂點(diǎn),每個(gè)頂點(diǎn)的表示方式為:頂點(diǎn)名稱和該頂點(diǎn)相連的所有的其他頂點(diǎn)的名稱,所組成的邊的長度。
例如,圖中O點(diǎn)表示方式為:{‘O’:{‘A’:2,‘B’:5,‘C’:4}}。
提示:用eval函數(shù)處理輸入,eval函數(shù)具體用法見第8章函數(shù)(下)常建的內(nèi)置函數(shù)。
輸入格式:
輸入多行字符串,每行表示一個(gè)頂點(diǎn)。
輸出格式:
輸出圖中所有的頂點(diǎn)數(shù)量,邊的數(shù)量,邊的總長度。數(shù)值之間有1個(gè)空格。
輸入樣例:
4
{'a':{'b':10,'c':6}}
{'b':{'c':2,'d':7}}
{'c':{'d':10}}
{'d':{}}
輸出樣例:
4 5 35
代碼:
s1, s2 = 0, 0
n = int(input())
for i in range(n):
lis = [v2 for v2 in [v1 for v1 in eval(input()).values()][0].values()]
s1 += len(lis)
s2 += sum(lis)
print(n, s1, s2)
7-4 sdut-分析每隊(duì)活動投票情況
利用集合分析活動投票情況。
第一小隊(duì)有五名隊(duì)員,序號是1,2,3,4,5; 第二小隊(duì)也有五名隊(duì)員,序號6,7,8,9,10。
輸入一個(gè)得票隊(duì)員的編號的字符串,求第一、二小隊(duì)沒有得票的隊(duì)員。在一行中輸入得票的隊(duì)員的序列號,用逗號隔開。
輸入格式:
在一行中輸入得票的隊(duì)員的序列號,用逗號隔開。
輸出格式:
在第一行中輸出第一小隊(duì)沒有得票的隊(duì)員序號,用空格分開;
在第二行中輸出第二小隊(duì)沒有得票的隊(duì)員序號,用空格分開。
輸入樣例:
1,5,9,3,9,1,1,7,5,7,7,3,3,1,5,7,4,4,5,4,9,5,10,9
輸出樣例:
2
6 8
代碼:
ls = list(map(int, input().split(',')))
s1, s2 = [], []
for i in range(1, 11):
if i not in ls:
if 1 <= i <= 5:
s1.append(i)
else:
s2.append(i)
print(*s1, sep=' ')
print(*s2, sep=' ')
7-5 sdut-統(tǒng)計(jì)字符在字符串中出現(xiàn)的次數(shù)
統(tǒng)計(jì)并輸出某給定字符在給定字符串中出現(xiàn)的次數(shù)。
輸入格式:
第一行給出一個(gè)以回車結(jié)束的字符串(一行少于80個(gè)字符);
第二行輸入一個(gè)字符。
輸出格式:
在一行中輸出給定字符在給定字符串中出現(xiàn)的次數(shù)。(如果未出現(xiàn),則輸出0)
輸入樣例:
programming is More fun!
m
輸出樣例:
2
代碼:
s = input()
c = input()
print(s.count(c))
7-6 sdut-輸出N天后星期幾縮寫
已知,今天是星期一。輸入一個(gè)正整數(shù)n,輸出n天之后對應(yīng)的星期幾的名稱縮寫。
星期日 Sun
星期一 Mon
星期二 Tue
星期三 Wed
星期四 Thu
星期五 Fri
星期六 Sat
輸入格式:
在一行內(nèi)輸入一個(gè)正整數(shù)n。
輸出格式:
輸出n天之后對應(yīng)的星期幾的名稱縮寫。
輸入樣例:
1
輸出樣例:
Tue
代碼:
ls1 = [6, 0, 1, 2, 3, 4, 5]
ls2 = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
dic = dict(zip(ls1, ls2))
n = int(input()) % 7
print(dic[n])
7-7 sdut-四則運(yùn)算(用字典實(shí)現(xiàn))
根據(jù)輸入信息進(jìn)行四則運(yùn)算(用字典實(shí)現(xiàn))。
(與c語言的switch語句相比較。)
輸入格式:
第1行中輸入一個(gè)數(shù)字a;
第2行中輸入一個(gè)四幟運(yùn)算符(+ , - , * , / ) op,
在第3行中輸入一個(gè)數(shù)字b。
輸出格式:
在一行中輸出 a op b 的運(yùn)算結(jié)果(保留2位小數(shù))。
輸入樣例1:
7
/
3
輸出樣例1:
2.33
輸入樣例2:
10
/
0
輸出樣例2:
divided by zero
代碼:
dic = {'+': 'x+y', '-': 'x-y', '*': 'x*y', '/': "x/y if y!=0 else 'divided by zero'"}
x = int(input())
opt = input()
y = int(input())
ans = eval(dic[opt])
if type(ans) is not str:
print("%.2f" % ans)
else:
print(ans)
7-8 sdut-統(tǒng)計(jì)工齡
給定公司N名員工的工齡,按工齡增序輸出每個(gè)工齡段有多少員工。
輸入格式:
首先給出正整數(shù)N(≤10^5),即員工總?cè)藬?shù);隨后給出N個(gè)整數(shù),即每個(gè)員工的工齡,范圍在[0, 50]
。
輸出格式:
按工齡的遞增順序輸出每個(gè)工齡的員工個(gè)數(shù),格式為:“工齡:人數(shù)”。
每項(xiàng)占一行。
輸入樣例:
8
10 2 0 5 7 2 5 2
輸出樣例:
在這里給出相應(yīng)的輸出。例如:
0:1
2:3
5:2
7:1
10:1
代碼:
n = int(input())
ls1 = list(map(int, input().split()))
dic = {}
for it in ls1:
dic[it] = dic.get(it, 0) + 1
ls2 = sorted(dic.keys())
for i in ls2:
print("%d:%d" % (i, dic[i]))
7-9 sdut-字典合并
輸入用字符串表示兩個(gè)字典,輸出合并后的字典。字典的鍵用一個(gè)字母或數(shù)字表示。
注意:1和‘1’是不同的關(guān)鍵字!
輸入格式:
在第一行中輸入第一個(gè)字典字符串;
在第二行中輸入第二個(gè)字典字符串。
輸出格式:
在一行中輸出合并的字典,輸出按字典序。
“1” 的 ASCII 碼為 49,大于 1,排序時(shí) 1 在前,“1” 在后。其它的字符同理。
輸入樣例1:
{1:3,2:5}
{1:5,3:7}
輸出樣例1:
1:8
2:5
3:7
輸入樣例2:
{"1":3,1:4}
{"a":5,"1":6}
輸出樣例2:
1:4
'1':9
'a':5
代碼:
a = dict(eval(input()))
b = dict(eval(input()))
for it in b.keys():
a[it] = a.get(it, 0) + b[it]
ls1 = list(a.items())
ls1.sort(key=lambda x: ord(x[0]) if type(x[0]) == str else x[0])
ls2 = list(str(dict(ls1)).strip('{}').replace(' ', '').replace('"', "'").split(','))
for it in ls2:
print(it)
7-10 sdut-兩數(shù)之和
給定一組整數(shù),還有一個(gè)目標(biāo)數(shù),在給定的一組整數(shù)中找到2個(gè)數(shù)字,使其和為目標(biāo)數(shù)。
如找到,解是唯一的。找不到則顯示 “no answer”。
PYTHON實(shí)現(xiàn)提示:用一重循環(huán)加字典實(shí)現(xiàn)。
輸入格式:
第1行中給出一組整數(shù)。 在第2行輸入目標(biāo)數(shù)。
輸出格式:
在一行中輸出這2個(gè)數(shù)的下標(biāo),用一個(gè)空格分開。輸出的下標(biāo)按從小到大排序。
如果找不到,則顯示 “no answer”。
輸入樣例1:
2 7 11 15
9
輸出樣例1:
0 1
輸入樣例2:
3 6 9 8 19
10
輸出樣例2:
no answer
代碼:
ls = list(map(int, input().split()))
n = int(input())
flag = 0
for it in ls:
if n - it in ls:
print(ls.index(it), ls.index(n - it))
flag = 1
break
if flag == 0:
print("no answer")
7-11 sdut-能同時(shí)被3、5、7整除的數(shù)的個(gè)數(shù)
求指定區(qū)間[a,b]內(nèi)能同時(shí)被3、5、7整除的數(shù)的個(gè)數(shù)。
提示:用集合實(shí)現(xiàn)。
輸入格式:
在一行中從鍵盤輸入2個(gè)正整數(shù)a,b(1<=a<b<=10000000),用空格隔開。
輸出格式:
在一行輸出:大于等于a且小于等于b的區(qū)間內(nèi)、能同時(shí)被3、5和7整除的數(shù)的個(gè)數(shù)。
輸入樣例1:
10 100
輸出樣例1:
0
輸入樣例2:
1000 10000
輸出樣例2:
86
代碼:
n, m = map(int, input().split())
cnt = 0
for i in range(n, m + 1):
if i % 105==0:
cnt += 1
print(cnt)
7-12 sdut-集合相等問題
給定2 個(gè)集合S和T,試設(shè)計(jì)一個(gè)判定S和T是否相等的蒙特卡羅算法。
設(shè)計(jì)一個(gè)拉斯維加斯算法,對于給定的集合S和T,判定其是否相等。
輸入格式:
輸入數(shù)據(jù)的第一行有1 個(gè)正整數(shù)n(n≤10000),表示集合的大小。
接下來的2行,每行有n個(gè)正整數(shù),分別表示集合S和T中的元素。
輸出格式:
將計(jì)算結(jié)論輸出。集合S和T相等,則輸出:YES,否則輸出:NO。
輸入樣例:
3
2 3 7
7 2 3
輸出樣例:
YES
代碼:
n = int(input())
st1 = set(map(int, input().split()))
st2 = set(map(int, input().split()))
if st1 == st2:
print("YES")
else:
print("NO")
7-13 sdut-植物與顏色
請定義具有red, orange, yellow, green, blue, violet六種顏色的變量color。
根據(jù)輸入的顏色名稱,輸出以下六種植物花朵的顏色:Rose(red), Poppies(orange), Sunflower(yellow), Grass(green), Bluebells(blue), Violets(violet)
。
如果輸入的顏色名稱不在變量color中,例如,輸入:purple
,請輸出:I don’t know about the color purple
.
輸入格式:
第1行為顏色的數(shù)量n。
接下來有n行字符串每行有一個(gè)字符串代表顏色名稱,顏色名稱最多30個(gè)字符。
輸出格式:
輸出對應(yīng)顏色的植物名稱,例如:Bluebells are blue
.
如果輸入的顏色名稱不在color變量中,例如purple, 請輸出I don’t know about the color purple.
輸入樣例:
3
blue
yellow
purple
輸出樣例:
Bluebells are blue.
Sunflower are yellow.
I don't know about the color purple.
代碼:
ls1 = ['red', 'orange', 'yellow', 'green', 'blue', 'violet']
ls2 = ['Rose', 'Poppies', 'Sunflower', 'Grass', 'Bluebells', 'Violets']
dic = dict(zip(ls1, ls2))
n=int(input())
for i in range(n):
col=input()
if col in ls1:
print("%s are %s."%(dic[col],col))
else:
print("I don't know about the color %s."%col)
7-14 sdut-眾數(shù)
眾數(shù)是指在一組數(shù)據(jù)中,出現(xiàn)次數(shù)最多的數(shù)。例如:1, 1, 3 中出現(xiàn)次數(shù)最多的數(shù)為 1,則眾數(shù)為 1。
給定一組數(shù),你能求出眾數(shù)嗎?
輸入格式:
輸入數(shù)據(jù)有多組(數(shù)據(jù)組數(shù)不超過 50)。對于每組數(shù)據(jù):
第 1 行輸入一個(gè)整數(shù) n (1 <= n <= 10000),表示數(shù)的個(gè)數(shù)。
第 2 行輸入 n 個(gè)用空格隔開的整數(shù) Ai (0 <= Ai <= 100000),依次表示每一個(gè)數(shù)。
輸出格式:
對于每組數(shù)據(jù),在一行中輸出眾數(shù)以及它出的次數(shù),中間用空格分隔。
數(shù)據(jù)保證有唯一的眾數(shù)。
輸入樣例:
3
1 1 3
5
0 2 3 1 2
輸出樣例:
1 2
2 2
代碼:
while True:
try:
n=int(input())
ls=list(map(int,input().split()))
num=max(ls,key=ls.count)
print(num,ls.count(num))
except EOFError:
break
7-15 sdut-查字典
遇到單詞不認(rèn)識怎么辦? 查字典?。?br> 已知字典中有n個(gè)單詞,現(xiàn)有m個(gè)不認(rèn)識的單詞,詢問這m個(gè)單詞是否出現(xiàn)在字典中,如果在字典中就輸出其含義,如果不在字典中,就輸出:Not found!
輸入格式:
含有多組測試用例。
第一行輸入n,m (n>=0&&n<=100000&&m>=0&&m<=100000)分別是字典中存在的n個(gè)單詞,和要查詢的m個(gè)單詞.
緊跟著n行,代表字典中存在的單詞及其解釋(含義);
然后m行,要查詢的m個(gè)單詞。
若n=0&&m=0 程序結(jié)束
輸出格式:
對于待查詢的單詞,若在字典中存在則輸出其解釋(含義),不存在輸出Not found!
輸入樣例:
3 2
red: having the colour of blood or fire
green:having the colour of grass or the leaves of most plants and trees
blue:having the colour of a clear sky or the sea/ocean on a clear day
blue
abcded
0 0
輸出樣例:
having the colour of a clear sky or the sea/ocean on a clear day
Not found!
代碼:
while True:
try:
dic={}
n,m=map(int,input().split())
if n==0 and m==0:
break
for i in range(n):
s1,s2=input().split(':')
dic[s1]=s2
for i in range(m):
col=input()
if col in dic.keys():
print(dic[col])
else:
print("Not found!")
except EOFError:
break
7-16 sdut-Map(dict)-String–單詞和字符鑒別器
讀入包含若干個(gè)單詞的文本數(shù)據(jù),將所有內(nèi)容轉(zhuǎn)換為大寫,統(tǒng)計(jì)每個(gè)單詞與該單詞的出現(xiàn)次數(shù)。此外,還需要統(tǒng)計(jì)每個(gè)字符及其出現(xiàn)次數(shù)(不包括空格)。
輸入格式:
若干行的單詞,以空格作為分隔符,每行單詞數(shù)量不定。
遇到一行數(shù)據(jù)“0000”,讀取數(shù)據(jù)結(jié)束。(字符串“0000”不計(jì)入上述統(tǒng)計(jì)數(shù)據(jù))
輸出格式:
全部數(shù)據(jù)讀取完成,輸出如下信息:
(1)出現(xiàn)次數(shù)最多的單詞及其出現(xiàn)次數(shù);若次數(shù)相同,輸出字典序最大的單詞。
(2)出現(xiàn)次數(shù)最少的單詞及其出現(xiàn)次數(shù);若次數(shù)相同,輸出字典序最小的單詞。
(3)每個(gè)字母,按A到Z的順序以及次數(shù)。
其中,單詞和字母占10個(gè)字符位置,左對齊;計(jì)數(shù)(即:出現(xiàn)次數(shù))占8位,右對齊。
提示:
Java語言,建議使用HashMap存儲數(shù)據(jù);
Python語言,建議使用dict存儲數(shù)據(jù)。
輸入樣例:
I would rather have had one breath of her hair
one KISS of her mouth one touch of her hand than an eternity without it
I WOULD rathER haVE HAD oNe BreatH Of Her Hair
ONE kiss of her mouth one touch of her hand than an eternity WITHOUT IT
0000
輸出樣例:
ONE 6
AN 2
A 16
B 2
C 2
D 6
E 22
F 6
G 0
H 26
I 12
J 0
K 2
L 2
M 2
N 14
O 20
P 0
Q 0
R 16
S 4
T 20
U 8
V 2
W 4
X 0
Y 2
Z 0
代碼:文章來源:http://www.zghlxwxcb.cn/news/detail-497007.html
ls_a = [chr(c) for c in range(65, 91)]
ls_b = [0] * 26
dic1, dic2 = {}, dict(zip(ls_a, ls_b))
while True:
ls1 = list(input().upper().split())
if ls1 == ["0000"]:
break
for it in ls1:
dic1[it] = dic1.get(it, 0) + 1
for i in str(ls1):
if i in dic2:
dic2[i] += 1
ls2 = sorted(dic1, key=lambda x: (dic1[x], x), reverse=True)
print("%-10s%8d" % (ls2[0], dic1[ls2[0]]))
print("%-10s%8d" % (ls2[-1], dic1[ls2[-1]]))
for k, v in dic2.items():
print("%-10s%8d" % (k, v))
因?yàn)檫@學(xué)期剛學(xué)Python,就當(dāng)是做個(gè)筆記了,代碼雖然都能過,但可能不是特別好,有不當(dāng)?shù)牡胤綒g迎指正,感謝大家的耐心閱讀
212丨acc丨2022.11.11文章來源地址http://www.zghlxwxcb.cn/news/detail-497007.html
到了這里,關(guān)于SDUT—Python程序設(shè)計(jì)實(shí)驗(yàn)六(字典與集合)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!