成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

CodeSalt | Python解決按學(xué)生年齡排序的實(shí)際問題

yangrd / 2852人閱讀

摘要:解決按學(xué)生年齡排序的實(shí)際問題問題定義一個(gè)包含姓名性別年齡,需要按年齡給學(xué)生排序。輸出按照年齡進(jìn)行排序好的。思路使用冒泡排序,比較相鄰的學(xué)生,如果第一個(gè)學(xué)生的值比第二個(gè)學(xué)生的值大,那么就整體交換這兩個(gè)元素。

Python解決按學(xué)生年齡排序的實(shí)際問題

問題:定義一個(gè)Class:包含姓名name、性別gender、年齡age,需要按年齡給學(xué)生排序。
輸入:包含學(xué)生對(duì)象的List。
輸出:按照年齡age進(jìn)行排序好的List。

思路1:使用冒泡排序,比較相鄰的學(xué)生,如果第一個(gè)學(xué)生的age值比第二個(gè)學(xué)生的age值大,那么就整體交換這兩個(gè)元素。持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟。一直到?jīng)]有任何一對(duì)學(xué)生需要比較。
思路2:使用Python內(nèi)建方法sorted()。

(這個(gè)問題其實(shí)是筆者面試時(shí)候手寫的一個(gè)實(shí)際問題,比較面向小白,我們可以通過這樣一個(gè)簡單的問題復(fù)習(xí)Python的一些基礎(chǔ)知識(shí)點(diǎn))

1. 前期準(zhǔn)備 1.1 定義Class
class Student(object):
    def __init__(self, name, gender, age):
        self.__name = name
        self.__gender = gender
        self.__age = age
    
    # 取得age屬性
    def getAge(self):
        return self.__age
    
    # 打印
    def printStudent(self):
        return self.__name, self.__gender, self.__age
1.2 生成包含隨機(jī)學(xué)生對(duì)象的List
# 生成包含隨機(jī)學(xué)生對(duì)象的list
def generateStudent(num):
    # num為需要生成的測(cè)試對(duì)象數(shù)
    list = []
    for i in range(num):
        randName = "".join(random.sample(string.ascii_letters, 4))
        randGender = random.choice(["Male", "FeMale"])
        randAge = random.randint(10,30)
        s = Student(randName, randGender, randAge)
        list.append(s)
    return list
2. 開始排序 2.1 使用冒泡排序

思路已在開頭介紹,我們直接來看代碼:

def sortStudent(list):
    for i in range(len(list)):
        for j in range(1, len(list)-i):
            if list[j-1].getAge() > list[j].getAge():
                list[j-1], list[j] = list[j], list[j-1]
    return list
2.2 使用Python內(nèi)建方法sorted

配合lambda表達(dá)式使用,非常簡潔,代碼如下:

sorted(list, key=lambda student: student.getAge()) # 將對(duì)象的age屬性作為排序的Key

我們?cè)谶@里補(bǔ)充一下 sorted()lambda表達(dá)式 的相關(guān)知識(shí)點(diǎn):

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

官方文檔
關(guān)于參數(shù)的說明:
key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).
reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.

key里接收的可以是某一個(gè)指定的函數(shù)(如lambda函數(shù))返回的一個(gè)值,作為指定的比較依據(jù)。

reverse默認(rèn)是False從小到大排序,設(shè)置為True后可以從大到小。

關(guān)于穩(wěn)定性的說明:
The built-in sorted() function is guaranteed to be stable.

(看到官方文檔的說明中寫道,這個(gè)方法是保證穩(wěn)定的喲!)

關(guān)于原理:Python內(nèi)置的sorted()方法背后使用的是Timsort算法,當(dāng)數(shù)據(jù)越接近Ordered Data的時(shí)候,時(shí)間復(fù)雜度越接近O(N)。在我們的這個(gè)問題中,年齡屬性是比較符合Ordered Data的。感興趣的可以點(diǎn)擊Timsort查看更多哈!

2.2.2 lambda表達(dá)式

直接看一個(gè)簡單的例子就能明白了~

>>> pairs = [("one",1),("two",2),("three",3),("five",5),("zero",0),("four",4)]
>>> sorted(pairs, key=lambda pair: pair[1]) # List中每個(gè)tuple對(duì)的排序依據(jù)是tuple中的第2個(gè)值
[("zero", 0), ("one", 1), ("two", 2), ("three", 3), ("four", 4), ("five", 5)] 

3. 執(zhí)行測(cè)試

構(gòu)建測(cè)試用的隨機(jī)數(shù)據(jù),計(jì)算兩種方法的執(zhí)行時(shí)間進(jìn)行比較~

if __name__ == "__main__":

    # list 形式是[("hZDw", "FeMale", 17)...]
    list = generateStudent(10000)

    # 方法1:使用冒泡排序
    start_Time1 = time.time()
    sortStudent(list)
    end_Time1 = time.time()
    # 方法1中,使用10000個(gè)測(cè)試數(shù)據(jù)的排序時(shí)間是22.243秒以上(非精確)
    print("%s cost time %s" % ("sortStudent" , end_Time1 - start_Time1))


    # 方法2:使用Python內(nèi)建的sorted方法+lambda表達(dá)式
    # 由于sorted方法背后使用的timsort方法,當(dāng)數(shù)據(jù)越接近Ordered data的時(shí)候,時(shí)間復(fù)雜度越接近O(N)。
    # 在這個(gè)例子里面,年齡屬性是比較接近Ordered data的。
    start_Time2 = time.time()
    sorted(list, key=lambda student: student.getAge()) # 將對(duì)象的屬性作為排序的Key
    end_Time2 = time.time()
    print("%s cost time %s" % ("sorted" , end_Time2 - start_Time2))

測(cè)試結(jié)果:
使用方法1(冒泡排序),當(dāng)測(cè)試數(shù)據(jù)量是10000個(gè)的時(shí)候,排序時(shí)間是22.243秒左右。
使用方法2(內(nèi)建方法),當(dāng)測(cè)試數(shù)據(jù)量是1000000個(gè)的時(shí)候,排序時(shí)間的0.575秒左右。
雖然不是很精確,但差別顯然可見啦!


以上。

如有錯(cuò)誤,還望指正~
完整實(shí)現(xiàn)及測(cè)試可在Github找到:ActualProblem-Solution
感謝。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/40779.html

相關(guān)文章

  • python學(xué)習(xí)筆記-函數(shù)參數(shù)

    摘要:默認(rèn)參數(shù)的坑默認(rèn)參數(shù)的默認(rèn)值指向的必需時(shí)不變對(duì)象。舉一個(gè)例說明當(dāng)函數(shù)的默認(rèn)參數(shù)默認(rèn)為一個(gè)可變對(duì)象時(shí),會(huì)出現(xiàn)什么狀況。例如調(diào)用函數(shù)輸出結(jié)果當(dāng)然,如果已經(jīng)又一個(gè)對(duì)象,也可以在傳入時(shí)的名前輸入,會(huì)自動(dòng)將拆分成關(guān)鍵字參數(shù)。 函數(shù)就像是一個(gè)黑盒子,我們將相關(guān)的一些功能打包成一個(gè)函數(shù),后續(xù)再調(diào)用的時(shí)候,我們不再關(guān)心內(nèi)部如何實(shí)現(xiàn),而是只關(guān)心這個(gè)函數(shù)需要輸入(Input)什么,需要輸出(Output)...

    jasperyang 評(píng)論0 收藏0
  • 嘗試用數(shù)組寫一個(gè)學(xué)生信息管理系統(tǒng)

    摘要:這只是我嘗試做的一個(gè)簡單的程序,順便復(fù)習(xí)下語言,希望以后的自己能更加努力,努力跟隨大佬們的腳步。 這只是我嘗試做的一個(gè)簡單的程序,順便復(fù)習(xí)下C語言,希望以后的自己能更加努力,努力跟隨大佬們的腳步。 C語言學(xué)生信息管理系統(tǒng)包括以下功能: 1.添加學(xué)生信息 2.查詢學(xué)生信息 3.修改學(xué)生信息 4...

    wangshijun 評(píng)論0 收藏0
  • CodeSalt | Python數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn) — 鏈表

    摘要:數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)鏈表簡單介紹鏈表是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的指針。圖解如下查找通過遍歷鏈表,使用標(biāo)記是否找到了正在尋找的項(xiàng)。一旦為,就是對(duì)包含要?jiǎng)h除的項(xiàng)的節(jié)點(diǎn)的引用。 Python數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)—鏈表 1. 簡單介紹 鏈表(Linked list)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)...

    BaronZhang 評(píng)論0 收藏0
  • Python奇遇記:數(shù)據(jù)結(jié)構(gòu)窺探

    摘要:擠掉了堆中實(shí)現(xiàn)了堆排序。你可以用堆排序來查找一個(gè)序列中最大的或者最小的幾個(gè)元素。除了使用堆排序,中還有排序和,這兩個(gè)排序最終生成以列表表示的排序結(jié)果,堆排序也是。 這次我們來說說python中的數(shù)據(jù)結(jié)構(gòu)。當(dāng)然了,不會(huì)講很基礎(chǔ)的內(nèi)容。 用過python的都知道,python有著與其他語言很不一樣的數(shù)據(jù)類型,像什么列表、元組、集合、字典之類。這些數(shù)據(jù)類型造就了python簡單易用同時(shí)又很強(qiáng)...

    mrli2016 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<