python獲取字母在字母表對(duì)應(yīng)位置的幾種方法及性能對(duì)比較

來(lái)源:黑暗圣堂武士

python獲取字母在字母表對(duì)應(yīng)位置的幾種方法及性能對(duì)比較

某些情況下要求我們查出字母在字母表中的順序则涯,A = 1,B = 2 , C = 3见秽, 以此類(lèi)推,比如這道題目 https://projecteuler.net/problem=42 其中一步解題步驟就是需要把字母換算成字母表中對(duì)應(yīng)的順序浪南。

獲取字母在字母表對(duì)應(yīng)位置的方法,最容易想到的實(shí)現(xiàn)的是:

使用str.index 或者str.find方法:

In [137]: "ABC".index('B')
Out[137]: 1

In [138]: "ABC".index('B')+1
Out[138]: 2

#或者在前面填充一個(gè)字符,這樣index就直接得到字母序號(hào):
In [139]: "_ABC".index("B")
Out[139]: 2

我還想到把字母表轉(zhuǎn)成list或者tuple再index尾膊,性能或者會(huì)有提高媳危? 或者把字母:數(shù)字 組成鍵值存到字典中是個(gè)好辦法?

前兩天我還自己頓悟到了一個(gè)方法:

In [140]: ord('B')-64
Out[140]: 2

ord 和chr 都是python中的內(nèi)置函數(shù),ord可以把ASCII字符轉(zhuǎn)成對(duì)應(yīng)在ASCII表中的序號(hào),chr則是可以把序號(hào)轉(zhuǎn)成字符串冈敛。

大寫(xiě)字母中在表中是從65開(kāi)始待笑,減掉64剛好是大寫(xiě)字母在表中的位置。 小寫(xiě)字母是從97開(kāi)始抓谴,減于96就是對(duì)應(yīng)的字母表位置暮蹂。

哪種方法可能在性能上更好?我寫(xiě)了代碼來(lái)測(cè)試一下:

az = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
_az = "_ABCDEFGHIJKLMNOPQRSTUVWXYZ"

azlist = list(az)

azdict = dict(zip(az,range(1,27)))

text = az*1000000 #這個(gè)是測(cè)試數(shù)據(jù)

#str.find和str.index的是一樣的癌压。這里就沒(méi)必要寫(xiě)了仰泻。
def azindexstr(text):
    for r in text:
        az.index(r)+1
        pass

def _azindexstr(text):
    for r in text:
        _az.index(r)
        pass

def azindexlist(text):
    for r in text:
        azlist.index(r)
        pass

def azindexdict(text):
    for r in text:
        azdict.get(r)
        pass

def azindexdict2(text):
    for r in text:
        azdict[r]
        pass

def azord(text):
    for r in text:
        ord(r)-64
        pass

def azand64(text):
    for r in text:
        ord(r)%64
        pass

把上面的代碼復(fù)制粘貼到ipython ,然后用魔法函數(shù)%timeit測(cè)試各個(gè)方法的性能滩届。 ipython 是一個(gè)python交互解釋器集侯,附帶各種很實(shí)用的功能,比如文本主要到的%timeit 功能帜消。 請(qǐng)輸入pip install ipython安裝.

以下是我測(cè)試的結(jié)果數(shù)據(jù):

In [147]: %timeit azindexstr(text)
1 loop, best of 3: 9.09 s per loop

In [148]: %timeit _azindexstr(text)
1 loop, best of 3: 8.1 s per loop

In [149]: %timeit azindexlist(text)
1 loop, best of 3: 17.1 s per loop

In [150]: %timeit azindexdict(text)
1 loop, best of 3: 4.54 s per loop

In [151]: %timeit azindexdict2(text)
1 loop, best of 3: 1.99 s per loop

In [152]: %timeit azord(text)
1 loop, best of 3: 2.94 s per loop

In [153]: %timeit azand64(text)
1 loop, best of 3: 4.56 s per loop

從結(jié)果中可見(jiàn)到list.index速度最慢棠枉,我很意外。另外如果list中數(shù)據(jù)很多泡挺,index會(huì)慢得很?chē)?yán)重辈讶。 dict[r]的速度比dict.get(r)的速度快,但是如果是一個(gè)不存在的鍵dict[r]會(huì)報(bào)錯(cuò),而dict.get方法不會(huì)報(bào)錯(cuò)娄猫,容錯(cuò)性更好贱除。

ord(r)-64的方法速度不錯(cuò)生闲,使用起來(lái)應(yīng)該也是最方便,不用構(gòu)造數(shù)據(jù)勘伺。

2016年10月15日 20:31:19 codegay

擴(kuò)展閱讀:

ASCII對(duì)照表 http://tool.oschina.net/commons?type=4

IPython Tips and Tricks http://blog.endpoint.com/2015/06/ipython-tips-and-tricks.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跪腹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子飞醉,更是在濱河造成了極大的恐慌冲茸,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缅帘,死亡現(xiàn)場(chǎng)離奇詭異轴术,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钦无,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)逗栽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人失暂,你說(shuō)我怎么就攤上這事彼宠。” “怎么了弟塞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵凭峡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我决记,道長(zhǎng)摧冀,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任系宫,我火速辦了婚禮索昂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扩借。我一直安慰自己椒惨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布往枷。 她就那樣靜靜地躺著框产,像睡著了一般。 火紅的嫁衣襯著肌膚如雪错洁。 梳的紋絲不亂的頭發(fā)上秉宿,一...
    開(kāi)封第一講書(shū)人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音屯碴,去河邊找鬼描睦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛导而,可吹牛的內(nèi)容都是我干的忱叭。 我是一名探鬼主播隔崎,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼韵丑!你這毒婦竟也來(lái)了爵卒?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤撵彻,失蹤者是張志新(化名)和其女友劉穎钓株,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體陌僵,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡轴合,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了碗短。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片受葛。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖偎谁,靈堂內(nèi)的尸體忽然破棺而出总滩,到底是詐尸還是另有隱情,我是刑警寧澤巡雨,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布咳秉,位于F島的核電站,受9級(jí)特大地震影響鸯隅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜向挖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一蝌以、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧何之,春花似錦跟畅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蒜危,卻和暖如春虱痕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辐赞。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工部翘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人响委。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓新思,卻偏偏與公主長(zhǎng)得像窖梁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子夹囚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • python獲取字母在字母表對(duì)應(yīng)位置的幾種方法及性能對(duì)比較 某些情況下要求我們查出字母在字母表中的順序纵刘,A = 1...
    火星獵手閱讀 4,910評(píng)論 0 0
  • python學(xué)習(xí)筆記 聲明:學(xué)習(xí)筆記主要是根據(jù)廖雪峰官方網(wǎng)站python學(xué)習(xí)學(xué)習(xí)的,另外根據(jù)自己平時(shí)的積累進(jìn)行修正...
    renyangfar閱讀 3,052評(píng)論 0 10
  • 跑步荸哟,我們可以跑一次假哎, 但是堅(jiān)持每天都跑步的人可不多。 畢業(yè)等于失業(yè)敲茄。 這句話(huà)在我身上真的體現(xiàn)出來(lái)啦位谋。 我想找一份...
    sugar亖閱讀 181評(píng)論 0 1
  • 華夏千年■劉漢皇.從南山而下,西海是一面鏡子所有的崢嶸與忐忑堰燎,一株草的天空且不必說(shuō)掏父,中原逐鹿烽煙入誰(shuí)的酒樽天下沉浮...
    劉漢皇閱讀 227評(píng)論 13 13
  • 今天穿睡衣睡褲在家悠閑,突然接了朋友的電話(huà)說(shuō)到我家樓下了秆剪,于是我一脫褲子套了條半身裙下去開(kāi)門(mén)赊淑。 然后小姑娘居然邀我...
    唐苦不苦閱讀 111評(píng)論 1 1