2016-06-08 20 views
3

我有一行python代码,基本上把一个整数字符串(一个字母)。由于我使用if语句,它需要很多代码行......有没有一种方法可以使用列表来简化我的代码,以便它不占用63行代码?这里是我的代码:使用Python中的列表简化代码

if character in " ": 
    character = 0 
elif character in "Aa": 
    character = 1 
elif character in "Bb": 
    character = 2 
elif character in "Cc": 
    character = 3 
elif character in "Dd": 
    character = 4 
elif character in "Ee": 
    character = 5 
elif character in "Ff": 
    character = 6 
elif character in "Gg": 
    character = 7 
elif character in "Hh": 
    character = 8 
elif character in "Ii": 
    character = 9 
elif character in "Jj": 
    character = 10 
elif character in "Kk": 
    character = 11 
elif character in "Ll": 
    character = 12 
elif character in "Mm": 
    character = 13 
elif character in "Nn": 
    character = 14 
elif character in "Oo": 
    character = 15 
elif character in "Pp": 
    character = 16 
elif character in "Qq": 
    character = 17 
elif character in "Rr": 
    character = 18 
elif character in "Ss": 
    character = 19 
elif character in "Tt": 
    character = 20 
elif character in "Uu": 
    character = 21 
elif character in "Vv": 
    character = 22 
elif character in "Ww": 
    character = 23 
elif character in "Xx": 
    character = 24 
elif character in "Yy": 
    character = 25 
elif character in "Zz": 
    character = 26 
elif character in ".": 
    character = 27 
elif character in ",": 
    character = 28 
elif character in "?": 
    character = 29 
elif character in "'": 
    character = 30 
else: 
    character = 0 
+0

我要表明,虽然它可能被任何下面的答案来代替这一点,这是真的很明显这些代码做什么,而不必为明显的其他代码做什么。此外,如果您需要将ñ或ç添加到您的原始解决方案,那么很明显该如何做到这一点。 –

+0

@JoshRumbut我想如果你不知道'ord'函数或'.get'是否可能。但是你可以在它上面添加注释。为什么写60行时,你可以写6行和评论,并且一样清楚 – Keatinge

+0

这让我想起了https://github.com/AceLewis/my_first_calculator.py/blob/master/my_first_calculator.py – Keatinge

回答

1

你可以简单的设定范围内使用ord()函数设置ASCII值,然后利用指数()函数查找索引。

TestCase='T' 

# Make all Input to lowercase. 

TestCase=TestCase.lower() 


#calculate ASCII value of all lower character String 

RangeVariable=range(ord('a'),ord('z')) 

#Now Returning required Index value by comparing ASCII value of Testcase with that in RangVariable 


print(RangeVariable.index(ord(TestCase))) 
1

使用字典str.lower

d = {" ":0, "a": 1, "b": 2, ......,"'":30} 

character = d.get(character.lower(), 0) 

如果字符是不是在字典的默认值将是0虽然我不请参阅将空格设置为0并将其作为默认值的逻辑。

要创建字典按@ user23571152评论:

d = {c: i for i, c in enumerate(" " + string.ascii_lowercase + ".,?'")} 
+1

而不是明确写出这个巨大的字典,你可以做一些像'd = {c:i for i,c in enumerate(“”+ string.ascii_lowercase +“。,?'”)}'。 – user2357112

+0

@ user2357112,是的,我更多地显示逻辑,但我添加了你的建议 –

1

有从没有理由手......所有这些字母代码AZ 如果是α,从ORD减去97,否则.get()为0的默认字典如果不是在字典

specialChars = {" " : 0, "." : 27, "," : 28, "?" : 29, "'" : 30} 
char = "'" 
if char.isalpha(): 
    print(ord(char.lower())-ord('a')+1) 
else: 
    print(specialChars.get(char, 0)) 

这使得两个调用每个字符下订,我不知道你的实际功能的作品,但最好你只会计算ord('a')+1一个时间,使用T每个角色的帽子。或者你可以使用print(ord(char.lower())-96)如果你还没有幻数

+0

不要硬编码幻数。使用'ord('a')' – Barmar

+0

@Barmar我没有看到更好的写法。 96就是你必须用来得到a = 1 b = 2的数字。你真的认为这个代码会更清楚,顶部有一个名为“valueToSubtractFromOrd”的变量,它等于96.它不是一个有意义的数字 – Keatinge

+0

'ord (char.lower()) - ord('a')+ 1'。 – Barmar

3

把所有的字符放到一个大字符串中,字符在该字符串中的位置是你想要分配的值。通过首先将输入转换为小写字母,您可以处理大写和小写字母。

value = " abcdefghijklmnopqrstuvwxyz.,?'".find(character.lower()) 
0

这里的基本思想是:

character = ord(character.lower()) - ord('a') + 1 if character != ' ' else 0 

你可以使其适应输入您的特殊要求。由于您没有指定可接受的输入值域,因此我假定输入仅限于您示例中的内容。

0

我会用一个dict像这样:

In [0]: import string 

In [1]: keys = list(" ") + list(string.ascii_lowercase) 

In [2]: dict = {} 

In [3]: for v, k in enumerate(keys): dict[k] = v 

In [4]: def getCharVal(character): return dict.get(character.lower(), -1) 

In [5]: getCharVal("B") 
Out[5]: 2