首頁  >  文章  >  後端開發  >  非常適合菜鳥練手的3道趣味Python題

非常適合菜鳥練手的3道趣味Python題

little bottle
little bottle原創
2019-04-04 11:09:483452瀏覽

了解Python的小夥伴都知道Python雖然入門容易,但是涉及的知識超級多,而且技巧性很強!這些技巧就像鎖鏈一樣,需要一些勤加練習才能熟練起來,把知識點掌握牢固!今天小編就為大家精選了3道趣味的Python題目,大家一起活動手指,練起來吧!

非常適合菜鳥練手的3道趣味Python題

下面小編帶大家看看菜鳥和高手是分別是如何處理問題:

NO.1字串中的字元替換

字串是Python中最基本也是最重要的知識點,下面這題是關於字串替換。

建立一個函數,這個函數能把輸入的字串處理,並且會回傳取代了某些字元的字串,規則如下

·      如果一個字母是大寫子音,請將該字元替換為“Iron”。

·      如果字母是小寫子音或非字母字符,則對該字符不執行任何操作

·      如果一個字母是大寫元音,請將該字符替換為“ Iron Yard」。

·      如果一個字母是小寫元音,請用「Yard」取代該字元。

測試案例

輸入: "Hello WORLD!"

#輸出: "IronYardllYard IronIron YardIronIronIron!"

#菜鳥解法:

def replace_str(string):
	res = ""
	vowel = 'aeiou'
	for i in string:
		if i in vowel:
			res += 'Yard'
		elif i in vowel.upper():
			res += 'Iron Yard'
		elif i.isupper():
			res +='Iron'
		else:
			res += i
	return res

print(replace_str('Hello WORLD!'))

大神解法:

def tiy_fizz_buzz(s):
   return "".join(("Iron "*c.isupper() + "Yard"*(c.lower() in "aeiou")).strip() or c for c in s)

點評:

高手解法最巧妙不是用類似推到列表這樣的方法來循環處理字符串,而且非常巧妙的用"Iron"*True 或者" Iron"*False,如果是前者則為字串本身,而後者則為空""。然後在把兩個字串用 合成,再用or分類!完美把上面的if-elif-elif-else融合到了一行程式碼裡面,確實不錯!

NO.2趣味體重排序

非常適合菜鳥練手的3道趣味Python題

小麗在一個"減肥會所",每到月底小麗就很擔心,因為每個月都會公佈一份成員體重列表,每個月她都是列表中的最後一個,這意味著她是最重的。於是她就建議會長修改規則,例如新的規則如下:

新的排序規則將是按照「權重」來進行排序,如果權重相同,則按照體重字串來進行排序。 (權重的計算規則:體重數字不同位數上的數字的總和)

給定某種正常順序俱樂部的成員的體重字串,如何實現按照新規則排序呢? 測試用例: 輸入: "99 189 86 75" 輸出: "75 86 189 99"

菜鳥解法:

def order_weight(string):
    weight_list = string.split(' ')
    def helper(x):
        if not x:
            return x
            y = int(x)
            z = 0
            while y:
                z += y % 10
                Y = int(y / 10)
            return (z,x)
 
    weight_list.sort.sort(key = helper)
    return " ".join(weight_list)

大神解法:

def order_weight(_str):
    return' '.join(sortsd(_str.split(' '),key = lambda x: sum(int(c) for c in x)))

點評:

高手的解法同樣是比較簡潔!我們大部分人用for c in x 的時候都用到這一層就結束了,其實還可以對c再進行進一步操作然後再sum一下,這個例子可以舉一反三!一下子集合了許多sorted的高級用法,簡潔而有效!

3.丟骰子遊戲

用五個六面骰子玩的骰子遊戲,每投骰子組一次,就會出現5個數字的陣列(數字:1-6),統計數組裡每個數字出現的次數,將每個數字出現的次數拆分成3次和1次的組合,然後依照下面的規則進行計數。注意:如果出現次數大於或等於3次,那麼必須至少有一個按照3次來計算,不能全部按照1次來計算

3次1 = = 1000分  3次6 ​​= = 600分  

3次5 = = 500分  3次4 = = 400分  

3次3 = = 300分  3次2 = = = 200分 

1次1 => 100分  1次5 => 50分 

1次2 => 0分 1次3 => 0分 

1次4 => 0分1次6 => 0分

例如,5出現了5次,那麼應當做作3個5、1個5和1個5來計算得分;5出現了6次,那麼應當作3個5、3個5來計算得分,其他數字同理。

測試案例: 

丟骰子計算分數 

 5 1 3 4 1 50 2 * 100 = 250  

1 1 1 3 1 1000 100 = 1100  

2 4 4 5 4 400 50 = 450

##2 4 4 5 4 400 50 = 450

菜鳥解:

from collections import Counter
def score(dice):
    num_dict = dict(Counter(dice))
    res = 0
    for i in num_dict:
        if i == 1:
            res +=1000 * (int(num_dict[i] / 3)) + 100 * (num_dict[i] % 3)
            elif i == 5:
                res +=500 * (int(num_dict[i])) + 50 * (num_dict[i] % 3)
            else:
                res += 100 * (i * int(num_dict[i] / 3))
    return res

大神解法:

def score(dice):
        sum = 0 
        counter = [0,0,0,0,0,0]
        points = [1000, 200, 300, 400, 500, 600]
        extra = [100,0,0,0,50,0]
        for die in dice:
            counter[die-1] += 1
        for (i, count) in enumerate(counter):
            sum += (points[i] if count >= 3 else 0) + extra[i] * (count%3)
        return sum

點評:###rrreee###大神解法:###rrreee###評論:####點評:#### ###大神的解法在於設計的資料結構非常巧,事先根據題目的意思就設計好了幾個容器,然後counter列表巧妙的將(1-6)與(1-6)出現的次數關聯起來。 points和extra清單巧妙將數字出現的次數(3次和1次)和得分關聯表示,減少誤輸得分的情況,提高代碼重複利用,整個解法非常巧妙! ###

上面這幾題目看起來很簡單易懂,但解法就是沒有別人的簡潔巧妙!就好像廚藝大賽,看似一道簡單的蛋炒飯其實是非常考驗功底的!程式設計本身就是蘊含演算法 資料結構的融合,大家有空可以多學習學習優秀的程式碼,對自己學習提升都大有好處!

【推薦課程:Python欄位影片教學


#

以上是非常適合菜鳥練手的3道趣味Python題的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn