停止索引过多

时间:2019-05-21 08:48:28

标签: python python-2.7

因此,我必须对数字输入进行解码。 1-26中的每个数字都对应于A-Z,例如1-A,2-B,... 26-Z。我做了一本涵盖这方面的字典。 我的输出必须是对数字进行解码后得出的文本。

例如,我的输入可以是:195318520

19在我的字典中是S,接下来我要取53,所以我从E打印了字母5,然后31,不是一样,所以我打印C,下一个18R,依此类推,直到得到SECRET"00"将是文本中的" ",而"01"将是"1" ... "09"-"9"

所以我编写了这段代码,我知道它有点刺耳,但是以某种方式可以打印正确的东西,但最后却出错了。

from textwrap import wrap
import sys
sir=raw_input().strip('')

d= {"00":" ",'1':'A', '2':'B', '3':'C' , '4':'D' , '5':'E', '6':'F', '7':'G', '8':'H', '9':'I', "10":'J', "11":'K', "12":'L', "13":'M', "14":'N', "15":'O', "16":'P',"17":'Q', "18":'R', "19":'S', "20":'T', "21":'U', "22":'V',"23":'W', "24":'X', "25":'Y', "26":'Z' }

pair=wrap(sir,1)

d["01"]=d["1"]
d["02"]=d["2"]
d["03"]=d["3"]
d["04"]=d["4"]
d["05"]=d["5"]
d["06"]=d["6"]
d["07"]=d["7"]
d["08"]=d["8"]
d["09"]=d["9"]

for i in range(len(pair)):
    pair[i:i+2]=[''.join(pair[i:i+2])]
    pair[i]=pair[i].strip()
    if pair[i] <= "26":
        sys.stdout.write(d[pair[i]])
        #print d[pair[i]] 
    else:
        pair[i]=list(pair[i])
        sys.stdout.write(d[pair[i][0]])
        #print d[pair[i][0]] 
        pair.insert(i+1,pair[i][1])

输入:195318520

SECRETTraceback (most recent call last): File "decodare.py", line 27, in <module> sys.stdout.write(d[pair[i]]) KeyError: ''

我认为问题在于for对其索引的编制过多,len(pair)具有固定值,但是我的i它是动态的,取决于所取的一对数字。

2 个答案:

答案 0 :(得分:1)

我不确定您从textwrap会获得什么好处,但是此功能可用于您的示例输入:

def parse(sir):
    ret = []
    taken = False
    for index,n in enumerate(sir):
        if not taken:
            dbl = (''.join(sir[index:]) + '0')[:2]
            val = int(dbl)
            taken = True
            if 1 <= val <= 26:
                ret.append(chr(val + 64))
            elif val == 0:
                ret.append(' ')
            else:
                taken = False
                val = int(n)
                ret.append(chr(val + 64))
        else:
            taken = False


    return ''.join(ret)

sir = '195318520'

print(parse(sir))

输出:

SECRET

答案 1 :(得分:0)

然后确定,继续使用wrap和您的dict

d= {"00":" ",'1':'A', '2':'B', '3':'C' , '4':'D' , '5':'E', '6':'F', '7':'G', '8':'H', '9':'I', "10":'J', "11":'K', "12":'L', "13":'M', "14":'N', "15":'O', "16":'P',"17":'Q', "18":'R', "19":'S', "20":'T', "21":'U', "22":'V',"23":'W', "24":'X', "25":'Y', "26":'Z' }

d["01"]=d["1"]
d["02"]=d["2"]
d["03"]=d["3"]
d["04"]=d["4"]
d["05"]=d["5"]
d["06"]=d["6"]
d["07"]=d["7"]
d["08"]=d["8"]
d["09"]=d["9"]

def parse(sir):
    ret = []
    taken = False
    for index,n in enumerate(sir):
        if not taken:
            dbl = (''.join(sir[index:]) + '0')[:2]
            val = int(dbl)
            taken = True
            if 0 <= val <= 26:
                ret.append(d[dbl])
            else:
                taken = False
                val = int(n)
                ret.append(d[n])
        else:
            taken = False


    return ''.join(ret)

sir = '195318520'
pair=wrap(sir, 1)

print(parse(pair))

输出:

SECRET