2017-05-27 74 views
3

我工作的一個項目,我需要改變數值爲字母字符,目前,我有這樣的:如何減少類似if語句的python?

if finposb == "2": 
    finposb = "a" 
if finposb == "3": 
    finposb = "b" 
if finposb == "4": 
    finposb = "c" 
if finposb == "5": 
    finposb = "d" 
if finposb == "6": 
    finposb = "e" 
if finposb == "7": 
    finposb = "f" 
if finposb == "8": 
    finposb = "g" 
if finposb == "9": 
    finposb = "h" 

我想知道是否有降低,爲更短的代碼行的方式, 謝謝!

+3

爲此詞典創建一本詞典 – Gahan

回答

6
letters='abcdefghijklmnopqrstuvwxyz' 
finposb=letters[int(finposb)-2] 

這應該工作,不需要字典。如果你想讓它更短:

finposb='abcdefghijklmnopqrstuvwxyz'[int(finposb)-2] 
+3

您可以索引一個字符串;沒有列表是必要的。 – chepner

+0

好點chepner –

3

使用字典:

DIGIT2LETTER = { 
    "2": "a", "3": "b", "4": "c", "5": "d", "6": "e", "7": "f", "8": "g", "9": "h" 
} 
finposb = DIGIT2LETTER[finposb] 
3

在這種情況下,dictionary可能是你在找什麼。

finposb = { 
    "2": "a", 
    ... 
    "9": "h" 
} 

>>> print(finposb["2"]) 
a 

字典的一個好處是,你可以,如果你想既"2"2映射到"a"幾個鍵映射到相同的值,例如,你可以說

finposb["2"] = "a" # string 
finposb[2] = "a" # numeric 

此外,有兩種合理的方式從一個密鑰(例如「2」到「a」)獲取您的價值。

finposb[key] # raise KeyError if key is not in the dictionary 
finposb.get(key, None) # default to None if the key is missing 

首先是方便,因爲它拋出一個有用的錯誤和可以肯定的,關鍵是不是在你的字典,而第二個有許多其他便利設施,如能夠返回自己如果密鑰丟失。

finposb.get(key, key) # returns key if key does not map to a value 

經典,這種類型的表是用來查找的字符集,如ASCII有許多字符可以被存儲在一個緊湊的方式(你怎麼回事表達了一封信給一臺計算機比作爲一個數字?),然後由程序解釋。

這個更現代的形式被稱爲unicode,它可以用來描述「普通」拉丁字母以外的大量不同的字符。

2
>>> pool = {"2": "a", "3": "b", "4": "c", "5": "d", "6": "e", "7": "f", "8": "g", "9": "h"} 
>>> finposb = '2' # get any digit here 
>>> if str(finposb) in pool.keys(): 
    finposb = pool[str(finposb)] 


>>> finposb 
'a' 

如果在字典中使用數字作爲字符串,則在整個片段中將其表示爲字符串。

+0

你不需要繼續調用'str';所有的值都是字符串。 – chepner

+0

我已經使用str()方法檢查數字,如果它是整數格式,那麼程序執行不會中斷。 – Gahan

2

可以濫用chr()內置的,並得到:

finposb = chr(int(finposb)+95) 

沒有硬編碼列表吧。

7

你不需要任何中間數據結構;使用finposb的ASCII值(或Python 3中的Unicode代碼點)。

# ord("a") - ord("2") == 47 
finposb = chr(ord(finposb) + 47) 

如果你沒有這樣一個很好的,隱含的規則,你可以使用string.maketrans做一個轉換表,並string.translate該表適用於您的輸入。

>>> tbl = string.maketrans("23456789", "abcdefgh") 
>>> string.translate("2", tbl) 
'a' 

translate充當身份的功能,如果第一個參數沒有出現在轉換表:

>>> string.translate("z", tbl) 
'z' 
2
import string 
finposb = string.ascii_lowercase[int(finposb)-2] 
+0

刪除了字符硬編碼 – pramod

+1

'string.ascii_lowercase [...]'是合法的;不需要先建立列表。 – chepner

1

使用此

import string 
finposb.translate(string.maketrans("".join([str(i) for i in range(2,10)]), "abcdefgh")) 

或簡單

import string 
finposb.translate(string.maketrans("23456789", "abcdefgh"))