Python123作業1(列表)


求平均成績


描述


輸入用空格分隔的兩個正整數n和m,表示后面要接收m個人的n門課的成績的輸入。隨后的m行,每行輸入用空格分隔的n個成績。題目保證m和n都在(0-100]之間。請分行輸出每門課的平均成績。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸入


第一行輸入用空格分隔的兩個正整數n和m‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

隨后的m行,每行輸入用空格分隔的n個成績。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸出


分行輸出每門課的平均成績


 

代碼

n, m = input().split()
n, m = int(n),int(m)
ls = []
for i in range(m):
    x = input()
    lt = [float(i) for i in x.split()]
    ls.append(lt)
for i in range(n):
    sum = 0
    for j in range(m):
        sum = sum + ls[j][i]
    a = sum/m
print(a)

 

絕對值排序


描述


讀入一個列表,按照絕對值從大到小排序,如果絕對值相同,則正數在前面。例如列表[3,-4,2,4],排序后的結果為[4,-4,3,2]
‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪建議使用list1=eval(input())直接讀入一個列表。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸入


題目的輸入為一行,是一個元素類型都是數值的列表,形如[3,-4,2,4]。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸出‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

輸出為一行,是按照絕對值從大到小排序后的列表里的元素,元素之間用一個英文半角逗號分隔,形如4,-4,3,2


 

代碼

ls = eval(input())
ls = sorted(ls,key = lambda x:(abs(x),x),reverse = True)
print((',').join(str(x) for x in ls))

 

多用戶登錄(列表)


描述


模擬用戶登錄過程,輸入賬號及密碼,驗證包括賬號是否存在,賬號密碼是否匹配等情況。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

賬號不存在,輸出提示信息“Wrong User”‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

賬號密碼不匹配,輸出“Fail”‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

登錄成功輸出“Success”‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

本題預設賬號與密碼對應如下。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

"aaa"   "123456"

"bbb"   "888888"

"ccc"   "333333"


 

代碼

code = {'aaa':'123456','bbb':'888888','ccc':'333333'} #定義字典匹配賬戶密碼
counter = input()
key = input()
if counter not in ['aaa','bbb','ccc']: #判斷賬戶是否在字典中
    print('Wrong User')
elif key == code[counter]:
    print('Success')
else:
    print('Fail')

 

身份證號升位


描述


第二代居民身份證是依據2003年6月28日第十屆全國人大常委會第3次會議通過的《中華人民共和國居民身份證法》實施的。第一代身份證十五位數升為第二代身份證十八位數的一般規則是:‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

第一步,在原十五位數身份證的第六位數后面插入19 (1905年1月1日以后出生)或20(2000.1.1-2004.12.31出生),這樣身份證號碼即為十七位數;
第二步,按照國家規定的統一公式計算出第十八位數,作為校驗碼放在第二代身份證的尾號。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

校驗碼計算方法:將身份證前十七位數分別乘以不同系數並求和
S = Sum(Ai * Wi)
Ai:表示第i位置上的身份證號碼數字值, i = 0, ... , 16 
Wi:表示第i位置上的加權因子,Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
S對11取模得到余數0-10,對應的校驗碼如下:
余數 Y: 0 1 2 3 4 5 6 7 8 9 10
校驗碼: 1 0 X 9 8 7 6 5 4 3 2

#題目假設所有人均出生於1905年1月1日以后,2005年1月1日以前‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸入格式 


輸入一個15位身份證號‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸出格式


 輸出一個18位身份證號


 

 

代碼

jym = {0:1,1:0,2:'X',3:9,4:8,5:7,6:6,7:5,8:4,9:3,10:2} #定義字典表示身份證最后一位的對應關系
fi = input() #輸入字符串
ls = list(fi) #將字符串轉換為列表
s = 0 #給和變量s賦初始值0
wi = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
if 5<=int(ls[6]+ls[7])<99: #判斷是否是20世紀出生的
    ls = ls[0:6]+['1']+['9']+ls[6:]
if 0<=int(ls[6]+ls[7])<=4: #判斷是否是21世紀出生的
    ls = ls[0:6]+['2']+['0']+ls[6:]
for i in range(0,17):
    s = s +int(ls[i])*wi[i]
mod = s%11#計算校驗碼
ls = ls + [str(jym[mod])] #在列表末尾加上校驗碼
print(('').join(map(lambda x:x,ls))) #輸出列表中的每個元素

 

分期付款計算器


描述


購買房屋或大宗家電時,很多時候可以分期付款,還款方式分為等額本息和等額本金兩種:‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

等額本息(Average Capital Plus Interest:ACPI)還款公式:
    每月還款額=貸款本金*月利率*(1+月利率)**總還款月數/((1+月利率)**總還款月數-1)
等額本金(Average Capital:AC)還款公式:
    每月還款額=貸款本金/總還款月數+(貸款本金-累計已還款本金)*月利率
設計一個程序計算分期付款時每一期的應還款額,還款方式輸入錯誤時,輸出“還款方式輸入錯誤”。‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸入格式


4行輸入:‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

第1行輸入一個浮點數,表示貸款本金‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

第2行輸入一個整數,表示分期月數‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

第3行輸入一個字符串,表示還款方式,限定只能輸入"ACPI"或"AC",分別表示等額本息和等額本金‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

第4行輸入一個浮點數,表示月利率‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪


輸出格式


輸出每月還款額,等額本金方式時,輸出的數字間用逗號分隔(用round()函數保留2位小數)‪‪‪‪‪‫‪‪‪‪‪‫‫‪‪‪‪‪‪‪‪‪‪‪‫‪‪‪‪‪‪‪‪‪‪‪‪

還款方式輸入錯誤時,輸出“還款方式輸入錯誤”


 

代碼

bj = float(input()) #輸入本金
mon = int(input()) #輸入分期付款的月份數
w = input() #分期付款的方式
l = float(input()) #輸入月利率,本金和月利率可以一起輸入 bj,l = map(lambda x:x,input().split())
ls = [] #定義一個空列表存儲等額本息方式付款的結果
yh = 0 #給已還本金賦初始值0
if w not in ['AC','ACPI']:
    print('還款方式輸入錯誤')#判斷還款方式是否輸入正確
elif w == 'AC':
    for i in range(mon):
        hk = bj/mon + (bj-yh)*l #每月還款金額計算
        yh = yh + (bj/mon) #每月已還本金計算(這里不要想得太復雜,就是 本金/月份數 )
        hk=round(hk,2) #對每月還款金額保留兩位小數
        ls.append(hk)#將還款金額加入結果列表
    print(ls)
else:
    hk = (bj*l*(1+l)**mon)/((1+l)**mon-1) #根據題目計算每月的還款金額(因為每個月的金額都一樣,所以不需要循環)
    hk = round(hk,2) #對每月還款金額保留兩位小數
    print(hk)

 

對Python lambda(匿名函數)的介紹


Calc = lambda n : n**n

Calc 是這個函數的函數名

Lambda是類似與def功能的關鍵詞

n 是參數

n**n 是返回值

匿名函數有個限制,就是只能有一個表達式,不用寫return,返回值就是該表達式的結果。

 

與其他函數聯合使用

map函數


map()函數接收兩個參數,一個是函數,一個是Iterable,map將傳入的函數依次作用到序列的每個元素,並把結果作為新的Iterator返回

 

li = [1,2,3,4,5,6,7,8,9]
print(list(map(lambda x:x*x,li)))
# [1, 4, 9, 16, 25, 36, 49, 64, 81]

reduce函數


reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:

reduce(func,[1,2,3]) 等同於 func(func(1,2),3)

 

#接受一個list並利用reduce()求積

from functools import reduce
li = [1,2,3,4,5,6,7,8,9]
print(reduce(lambda x,y:x * y,li))
# 結果=1*2*3*4*5*6*7*8*9 = 362880

filter函數


filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用於每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。

對於序列中的元素進行篩選,最終獲取符合條件的序列

 

# 在一個list中,刪掉偶數,只保留奇數

li = [1, 2, 4, 5, 6, 9, 10, 15]
print(list(filter(lambda x:x % 2==1,li)))  # [1, 5, 9, 15]

 

# 回數是指從左向右讀和從右向左讀都是一樣的數,例如12321,909。請利用filter()篩選出回數

li = list(range(1, 200))
print(list(filter(lambda x:int(str(x))==int(str(x)[::-1]),li)))
#[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]

sorted函數


sorted(iterable, /, *, key=None, reverse=False)

接收一個key函數來實現對可迭代對象進行自定義的排序

可迭代對象:主要與列表,字符串,元組,集合和字典

key:接受一個函數,根據此函數返回的結果,進行排序

reverse:排序方向,默認為從小到大,reverse=True為逆向

# 對列表按照絕對值進行排序
li= [-21, -12, 5, 9, 36]
print(sorted(li, key = lambda x:abs(x)))
# [5, 9, -12, -21, 36]

以上代碼僅為本人自己的方法並不唯一

如有錯誤,歡迎指正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM