成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

由 sort 中 key 的用法淺談 python

keke / 2652人閱讀

摘要:但是實際寫程序中,我們經(jīng)常會寫出許多繁雜的丑陋的代碼。特別推薦,許多代碼讓我獲益匪淺,比如這里對的使用。用可以寫出很簡單直觀的代碼,如下當然,上面不考慮效率,這里有一個利用分治法思想的高效的方法。更多文章更多閱讀中參數(shù)的用法高級編程技巧

用 Python 時間也算不短了,但總感覺自己在用寫 C++ 代碼的思維寫 Python,沒有真正用到其作為腳本語言的優(yōu)勢。之前刷 LeetCode 時,自己的 Python 代碼總是很長,很像披著 Python 外衣的 C++ 代碼(放在這里,不斷重構中)。

想來大概是因為覺得python簡單,平時只是零零碎碎的學習,也沒有去讀別人的代碼,導致掌握的不夠深入?;叵肫鹎岸螘r間的面試,面試官看我簡歷寫熟悉Python,就問了兩個Python的問題:

Python 中常用的優(yōu)化技巧(能夠提升 Python 執(zhí)行效率的,除了算法層面)

按照 value 從小到大輸出 dict 中的 key-value值。

我支支吾吾半天,就是沒有答到點上,直接導致被拒(后來整理的內(nèi)容放在這里)。所謂知恥而后勇,經(jīng)過一段時間對 Python 的重新學習,才慢慢發(fā)現(xiàn) Python 的一些強大與美妙之處。

從排序說起!

程序中經(jīng)常用到排序函數(shù),Python 提供了 sort 和 sorted 函數(shù),一個原地排序,一個返回排序后的新結果,函數(shù)原型很簡單:

sort([cmp[, key[, reverse]]])

自己用的最多的類似下面的語句:

>>> l = [43, 12, 4, 6]
>>> l.sort()
>>> l
[4, 6, 12, 43]

曾經(jīng)竊以為這就體現(xiàn)了 Python 的簡單優(yōu)雅,不像 C++ STL中那樣還需要指定迭代器范圍,然后對 sort 的理解也就止步于此。后來遇到稍微復雜一點的排序場景,自己就 Google-Stackoverflow-Copy,解決了眼前的問題,但是從來沒有去深挖(這也就導致那次面試中中沒有回答出來上面的第二個問題)。

sort 之美

后來去看了下 sort 的函數(shù)說明,包括 cmp, key, reverse 參數(shù)究竟怎么去用,又寫了幾個例子,以為這下子對 sort 可謂是理解透徹了。比如要要根據(jù)值的大小輸出字典內(nèi)容,那么就可以像下面這樣優(yōu)雅地解決:

>>> d = {1: "z", 2:"y", 3: "x"}
>>> print sorted(d.items(), key=lambda x: x[1])
[(3, "x"), (2, "y"), (1, "z")]

我甚至可以得到一個根據(jù)value排序的字典,只需要用 collections.OrderedDict 即可:

>>> from collections import OrderedDict
>>> sorted_d = OrderedDict(sorted(d.items(), key=lambda x: x[1]))
>>> sorted_d
OrderedDict([(3, "x"), (2, "y"), (1, "z")])
sort 之魅

我以為我對 sort 理解足夠了,直到在 hackerrank 遇到這個題目。

給定一個只包含大小寫字母,數(shù)字的字符串,對其進行排序,保證:

所有的小寫字母在大寫字母前面

所有的字母在數(shù)字前面

所有的奇數(shù)在偶數(shù)前面

考慮用 sort 函數(shù)來完成排序。開始之前,再來看看文檔對sort函數(shù)中key的說明:

key parameter to specify a function to be called on each list element prior to making comparisons. The value of the key parameter should be a function that takes a single argument and returns a key to use for sorting purposes.

通俗講,key 用來決定在排序算法中 cmp 比較的內(nèi)容,key 可以是任何可被比較的內(nèi)容,比如元組(python 中元組是可被比較的)。所以上面的排序問題可以用下面的代碼來解決:

>>> s = "Sorting1234"
>>> "".join(sorted(s, key=lambda x: (x.isdigit(), x.isdigit() and int(x) % 2 == 0, x.isupper(), x.islower(), x)))
"ginortS1324"

這里,lambda 函數(shù)將輸入的字符轉換為一個元組,然后 sorted 函數(shù)將根據(jù)元組(而不是字符)來進行比較,進而判斷每個字符的前后順序。

如果同樣的程序用 C++ 來寫的話,可能需要一個復雜的仿函數(shù),來定義排序的規(guī)則,遠沒有 Python 這般簡潔優(yōu)雅。

再探 Python

Python 是一門簡單方便的語言,相信這是大部分人對 Python 的第一感覺。初學 Python,我們可能癡迷于 Python 的列表解析,list 切片,字典推導,或者是陶醉在各種強大的第三方庫里,比如網(wǎng)絡庫 requests,科學計算庫 numpy,web開發(fā)框架 Django 等。

但是實際寫程序中,我們經(jīng)常會寫出許多繁雜的、丑陋的Python代碼。比如要判斷一個數(shù)字是否是回文數(shù)字,可能會習慣性地寫出下面這樣的代碼:

def isPalindrome(x):
    if x < 0:
        return False
    reversed_x = 0
    original_x = x
    while x > 0:
        reversed_x = reversed_x * 10 + x % 10
        x /= 10
    return reversed_x == original_x

仔細一看,這簡直就是 C++ 代碼,完全沒有 Python 的優(yōu)雅與簡單。那么,該怎樣寫才能夠顯的 Pythonic 呢?其實,用 Python 的話只要一行就可以啦(這里不考慮效率,如果考慮效率的話,C++會更加合適,單對這題來說,其實有比上面更高效的方法)!

def isPalindrome(x):
    return x >= 0 and str(x) == str(x)[::-1]

那么如何養(yǎng)成用 Pythonic 的思維解決問題呢?我覺得首先要對 Python 十分熟悉,精通大部分函數(shù)以及 Python 的特色:比如裝飾器,迭代器,生成器以等,下面舉幾個簡單的例子:

# 函數(shù)式編程
>>> nums = map(int, "123456789" )
>>> nums
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> reduce(lambda x, y: x+y, [1, 2, 3, 4, 5])
15
>>> sum(nums)
45
# 生成器
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...     print i
...
0
1
4
>>> for i in mygenerator:
...     print i
...
# lambda 匿名函數(shù)
>>> c = lambda *z: z
>>> c( 10, "test")
(10, "test")
# 迭代
>>> l = [i**2 for i in range(9)]
>>> l_iter = iter(l)
>>> next(l_iter)
0
>>> next(l_iter)
1
>>> next(l_iter)
4
# 數(shù)據(jù)結構 set
>>> set_a = set([i for i in range(1,9,2)])
>>> set_b = set([i for i in range(0,9,2)])
>>> print set_a | set_b
set([0, 1, 2, 3, 4, 5, 6, 7, 8])

其次,要多讀一些 Pythonic 的代碼,學習別人如何優(yōu)雅地使用python。這里我推薦去看 Leetcode 的 Discuss,里面有許多驚才艷艷的代碼。特別推薦 @StefanPochmann,許多代碼讓我獲益匪淺,比如這里對 iter() 的使用。

再來看一個問題,按照二進制位反轉 32 位的一個整形無符號數(shù)字。用 Python 可以寫出很簡單直觀的代碼,如下:

def reverseBits(n):
    bit_str = "{0:032b}".format(n)
    reverse_str = bit_str[::-1]
    return int(reverse_str, 2)

當然,上面不考慮效率,這里有一個利用分治法思想的高效的方法。

Python 是一門高效、簡單、方便的語言,但這并不意味你不花時間就可以用的很好。

更多文章

更多閱讀

Sorting Mini-HOW TO
sort()中cmp參數(shù)的用法
hackerrank: ginortS
Sort a Python dictionary by value
Python高級編程技巧

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

轉載請注明本文地址:http://systransis.cn/yun/37896.html

相關文章

  • 淺談 python sorted()與sort()

    摘要:返回值是一個經(jīng)過排序的可迭代類型,與一樣。注一般來說,和可以使用表達式。與的不同在于,是在原位重新排列列表,而是產(chǎn)生一個新的列表。 我們需要對List進行排序,Python提供了兩個方法 對給定的List L進行排序,方法1.用List的成員函數(shù)sort進行排序方法2.用built-in函數(shù)sorted進行排序(從2.4開始) ----------------------------...

    lansheng228 評論0 收藏0
  • Python 進階之路 (一) List 進階方法匯總,新年快樂!

    摘要:嘗射于家圃,有賣油翁釋擔而立,睨之,久而不去。康肅問曰汝亦知射乎吾射不亦精乎翁曰無他,但手熟爾。康肅忿然曰爾安敢輕吾射翁曰以我酌油知之。 開啟變身模式 大家好, 從這一期開始,我們會從小白變身為中等小白,在基礎起步階段有太多的東西我沒有講到,但是俗話說的好,無他,但手熟爾,只要多多練習,時間會是最好的證明,相信我們終有一天會成為高手,因此從這一系列開始,讓我們一起更上一層樓,還是和往常...

    garfileo 評論0 收藏0
  • Python進階筆記

    摘要:用匿名函數(shù)有個好處,因為函數(shù)沒有名字,不必擔心函數(shù)名沖突。和不同的是,把傳入的函數(shù)依次作用于每個元素,然后根據(jù)返回值是還是決定保留還是丟棄該元素。字符串給出當前平臺使用的行終止符。程序中間的退出,為正常退出。 列表生成式 函數(shù)的參數(shù)類型 lambda函數(shù) map, reduce, filter, sorted函數(shù) eval, exec, join, zip函數(shù) itertools中的...

    ygyooo 評論0 收藏0
  • 用了這么長時間python開發(fā),你還記得多少零碎基礎知識

    摘要:輸出下標和對應的元素集合集合是無序的,集合中的元素是唯一的,集合一般用于元組或者列表中的元素去重。 python內(nèi)置的數(shù)據(jù)類型 showImg(https://segmentfault.com/img/bVbrz1j); Python3.7內(nèi)置的關鍵字 [False, None, True, and, as, assert, async, await, break, class, co...

    zollero 評論0 收藏0
  • Python 進階之路 (二) Dict 進階寶典,初二快樂!

    摘要:新年快樂大家好,今天是大年初二,身在國外沒有過年的氛圍,只能踏實寫寫文章,對社區(qū)做點貢獻,在此祝大家新年快樂上一期為大家梳理了一些的進階用法,今天我們來看字典的相關技巧,我個人在編程中對字典的使用非常頻繁,其實對于不是非常大的數(shù)據(jù)存儲需求, 新年快樂 大家好,今天是大年初二,身在國外沒有過年的氛圍,只能踏實寫寫文章,對社區(qū)做點貢獻,在此祝大家新年快樂!上一期為大家梳理了一些List的進...

    ChristmasBoy 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<