前些天用到了list的sort方法,sort方法的對於字串的預設排序是按英文本母的順序來排序的,可是那並不是我想要的結果,我想按字串的長度來對list排序,這時就需要用到sort方法的引數。
我用的是key,通過制定key就可以對字串進行排序了,哈哈。當然也有其他方法,以後發現了在發到部落格了,即使很少有人看我的部落格。
看一下例子,
>>> list = ['tom','jan','marry','coco']
>>> list
['tom', 'jan', 'marry', 'coco']
對list進行預設排序
>>> list.sort()
>>> list
['coco', 'jan', 'marry', 'tom']
這時我們可以看到,預設的順序是英文本母順序,我們可以指定key來解決字串長度排序的問題,解決方法如下:
>>> list.sort(key=lambda x:len(x))
>>> list
['jan', 'tom', 'coco', 'marry']
看看,解決了。用到了lambda函式,每次看到lambda都要google,這次乾脆貼到部落格裡,查起來容易多了。
在python中使用lambda來建立匿名函式。lambda**於lisp語言。lambda的形式如下:
lambda會建立乙個函式物件,但不會把這個函式物件賦給乙個識別符號,而def則不同,它在建立函式物件的同時會進行這種操作。這是lambda的第乙個特點。lambda的第二個特點是,它只是乙個表示式,而不是乙個語句。如果單獨使它成為了乙個語句,比如:
如果你在你的python程式中寫下了這麼一行,那麼毫無意義,這一行**會建立乙個函式物件,但馬上又給丟棄了,因為你沒有使用它的返回值,即那個函式物件。也正是由於lambda只是乙個表示式,它可以直接作為list或dictionary的成員,比如:
在這個地方沒有辦法用def語句直接代替。第三,lambda表示式在「:」後只能有乙個表示式。也就是說,在def中,可以放在return後的也可以放在lambda,不能放在return後也不能放在這裡。更本質地說,後面的表示式是能夠返回乙個值的,不能返回值的不能放在這裡。因此,像if或for或print這種語句就不能用於lambda中,lambda一般只用來定義簡單的函式。當然,通過一些技巧,可以在lambda中實現與if或for相同的功能。比如:if語句可以利用and和or這兩個邏輯操作符的「短路」特性來模擬,比如:
這樣的話,如果test為真,那麼就會計算[x],當然得到的就是[x],由於在or操作符的左邊已經得到真值,or的右邊就不會被計算,因此得到的是[x][0],最後的結果是x。如果test為假,那麼根據and的特性,左邊已經為假,右邊不會被計算。這時or的左邊為假那麼就得到[y][0],最後的結果是y。注意在這裡不能寫成如下的形式:
在x為真值時,這種形式與上面這種形式是等價的。但設想這種情況,「如果test為真,則取0,如果test為假,則取」,也就是說x本身是乙個假值,用上面的形式書寫就是:
顯然不能達到目的,這個式子永遠只會取到。因此應該改寫成:
在lambda中迴圈語句也是可以模擬的,用的是map函式。比如:
當然,這種東西看起來就很複雜,如果可能最好不要巢狀使用lambda。print也是可以模擬的:
import sys
pp = lambda x: sys.stdout.write(str(x)+'/n')
pp(8) ===> 8
C 按字串長度排序
按字串長度排序可以分為以下三個步驟 讀取所有輸入行 對文字進行排序 按次序列印文字行 如下 include include include define maxlen 1000 char alloc int int getline char p,int n 讀取一行字元 int readline c...
字串長度
當字元全是英文本元的時候,兩者是一樣。這裡主要比較一下,中英文混排的時候,兩個計算結果。測試時編碼方式是utf8 複製 如下 str 中文a字1符 echo strlen str echo echo mb strlen str,utf8 輸出結果 14 6 結果分析 在strlen計算時,對待乙個u...
字串長度
在c c 中,字串是以零 0 結尾的。比如,對於下面的字串 hello word 在最後乙個字元 d 後面,還有乙個我們肉眼看不見的 0 字元,作為該字串的結束符。所以,hello word 其在記憶體中的儲存形式為 最後有乙個我們看不見的 0 明白了字串的結尾方式,那麼如何計算字串的長度呢?比如 ...