使用Python中的列表简化代码

3

我有一行Python代码,基本上是将一个整数分配给一个字符串(一个字母)。由于我使用if语句,需要很多代码行...... 有没有一种方法可以使用列表简化我的代码,使其不占用63行代码?以下是我的代码:

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

我建议虽然可以使用下面任何一个答案来替换它,但这段代码的作用非常明显,而其他代码的作用则不一定那么明显。此外,如果您需要在原始解决方案中添加ñ或ç,则很明显如何做到这一点。 - Josh Rumbut
@JoshRumbut 我猜如果你不知道ord函数或.get的作用,那么可能需要注释。但是你可以在其上方添加注释。为什么要写60行代码,当你可以只写6行代码和一个注释,同样清晰明了呢? - Keatinge
这让我想起了 https://github.com/AceLewis/my_first_calculator.py/blob/master/my_first_calculator.py - Keatinge
@Keatinge 也许,无论如何,将其放入一个命名良好的方法并加上注释是个好主意。不确定有多少人能够脱口而出96的含义,而且仍然需要硬编码最后几个值。还有一个问题是,如果某些字符改变了它们关联的值,变成与同一值相关联,或者如果需要处理西里尔字母怎么办。 - Josh Rumbut
6个回答

3
将所有字符放入一个大字符串中,其中这些字符在该字符串中的位置是您想要分配的值。您可以通过首先转换输入为小写来处理大写和小写字母。
value = " abcdefghijklmnopqrstuvwxyz.,?'".find(character.lower())

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
@user2357112,没错,我更多地展示了逻辑,但我加入了你的建议。 - Padraic Cunningham

1

没有必要手动编写所有字母a-z的代码... 如果是字母,就从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函数,我不知道你的实际函数是如何工作的,但理想情况下,您只需计算一次ord('a')+1并对每个字符使用即可。或者,如果您可以接受魔数,您也可以使用print(ord(char.lower())-96)

@Barmar 我看不到更好的编写方式。96只是你必须使用的数字,以使a = 1 b = 2。你真的认为如果在顶部有一个名为valueToSubtractFromOrd的变量等于96,这段代码会更清晰吗?这不是一个有意义的数字。 - Keatinge
ord(char.lower()) - ord('a')+1 - Barmar
@Barmar 现在每个字母都需要两次 ord 调用,其中一次每次都得到相同的值。 - Keatinge
base = ord('a')-1 然后使用 ord(char.lower()) - base - Barmar
@Barmar 好的,说得也有道理。我已经用第一种方法进行了编辑。 - Keatinge

1
你可以使用 ord() 函数设置 ASCII 值来简单地设置范围,然后使用 index() 函数查找索引。
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)))

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接