所以我有这个项目用于学校,我已经接近完成了它,但有一个我似乎无法正常工作。我的一个功能是:
vowels = "aeiou"
consonants = "bcdfghjklmnpqrstvwyz"
def alphapinDecode(tone):
s = tone.lower()
pin = ''
for ch in s:
if ch in consonants:
idx = consonants.find(ch)
elif ch in vowels:
idx2 = vowels.find(ch)
pin = str(pin) + str(idx*5 + idx2)
print(pin)
return None
在大多数情况下,函数运行的方式与我想要的完全相同。我取一个字符串,它将数字作为字符串返回。
例如:
>>> alphapinDecode('bomelela')
3464140
但是当我这样做时:
>>>> alphapinDecode('bomeluco')
它返回346448而不是它应该做的3464408(根据我的任务)。现在我知道函数根据代码给出了正确的答案,但我错过了什么让它包括8之前的0?
编辑:
函数应该采用你传递的字符串(音调)并将其分解成2个字母的块(元音/辅音对)。使用该对,它应该使用该对并用元音/辅音索引它们并返回一个数字。 >>> alphapinDecode(' hi')返回27因为辅音[h]给出idx = 5而元音[i]给出idx2 = 2
答案 0 :(得分:1)
我认为你的讲座试图测试学生的编码适应性。 如果真的想要实现这样的输出请尝试如下
vowels = "aeiou"
consonants = "bcdfghjklmnpqrstvwyz"
def alphapinDecode(tone):
s = tone.lower()
pin = ''
for ch in s:
if ch in consonants:
idx = consonants.find(ch)
elif ch in vowels:
idx2 = vowels.find(ch)
num = '%02d' % int((idx*5) + idx2) #python 2
num = "{0:0=2d}".format((idx*5) + idx2) #python 3 more verbose
pin = pin + str(num)
print(int(pin))
return None
alphapinDecode('bomeluco') # 3464408
alphapinDecode('bomelela') # 3464140
答案 1 :(得分:0)
你的方法可能很尴尬 - 我会一次迭代两个字符:
def alphapinDecode(tone):
s = tone.lower()
pin = ''
# Step over the string two characters at a time
for i in range(0, len(s), 2):
ch1 = s[i]
ch2 = s[i+1]
if ch1 in consonants and ch2 in vowels:
idx1 = consonants.find(ch1)
idx2 = vowels.find(ch2)
this_pair = idx1*5 + idx2
# For debugging
print(this_pair)
pin = pin + str(this_pair)
# We need to print without leading zeroes
print(int(pin))
# Returning the pin as an integer is better, IMO
return int(pin)
好的,现在我们的代码看起来好一些,我们可以看到,我希望,对于第二个文本中的co
对,值为1*5 + 3
,等于{{1}当然,但你真的想要8
。有很多方法可以做到这一点,但由于你是初学者,我将说明最简单的方法。
08
编辑:让我们忘记在字符串中累积答案,因为我们可以简化代码:
this_pair = idx1*5 + idx2
if this_pair < 10:
# If the pair is less than ten, prepend a leading zero
this_pair_pin = '0' + str(this_pair)
else
this_pair_pin = str(this_pair)
pin = pin + this_pair_pin