用Python翻译词典

时间:2015-11-03 18:32:44

标签: python python-2.7 dictionary

我正在做一个目标是创建两个程序的项目。一个程序读取用户的输入并将其转换为Leetspeak,而另一个程序将Leetspeak转换回英语。而不是垃圾邮件If语句或替换(“”,“”)我决定尝试使用字典来处理翻译。

转换为Leetspeak非常简单。我只是使用了字典和for循环。

但是,由于Leetspeak中的“字母”有时会包含多个字符,因此我发现很难将其转换回来而不会出现KeyErrors。

这是我到目前为止所拥有的。

phrase = raw_input('Enter a phrase: ')
output = []

KEY = {
    '4': 'A',
    '8': 'B',
    '(': 'C',
    '|)': 'D',
    '3': 'E',
    '|=': 'F',
    '6': 'G',
    '|-|': 'H',
    '!': 'I',
    '_|': 'J',
    '|<': 'K',
    '1': 'L',
    '|\/|': 'M',
    '|\|': 'N',
    '0': 'O',
    '|D': 'P',
    '(,)': 'Q',
    '|?': 'R',
    '5': 'S',
    '7': 'T',
    '|_|': 'U',
    '\/': 'V',
    '\/\/': 'W',
    '><': 'X',
    '`/': 'Y',
    '2': 'Z',
    ' ': ' ',
}

for char in phrase:
    if char in KEY:
        # This line works perfectly, since it only requires a single   
        # character
        print(KEY[char])
    else:
        while KEY[char] == False:
        # If I'm not getting KeyErrors I'm getting errors with appending
        # special characters or NoneType characters
        output = output.append(char)
    print(output)
    # I tried clearing the output after every iteration so that it could be
    # reused by the next char in phrase
    output = []

# Understand that all of the prints() are for testing the program. I'm   
# hoping to just have a single print() function at the end once everything  
# has been translated.      

如何转换所有这些Leetspeak字符?

至于为什么我选择不发送垃圾邮件如果声明和替换(“”,“”),我喜欢挑战自己的新概念。话虽如此,如果有必要的话,我总是以完全不同的方式开放。提前谢谢。

2 个答案:

答案 0 :(得分:1)

正如你所指出的那样,前进很容易:

message = 'HALLOWEEN'
KEY_reversed = {v:k for k, v in KEY.items()}

>>> print(''.join(KEY_reversed[c] for c in message))
|-|4110\/\/33|\|

向另一个方向迈进有点困难,但你可以用replace()来做:

output = '|-|4110\\/\\/33|\\|'
for k, v in sorted(KEY.items(), key=lambda x: len(x[0]), reverse=True):
    if k in output:
        output = output.replace(k, v)

>>> output
'HALLOWEEN'

如果没有排序,V和W等字符可能会有歧义,并且由于字典没有默认排序,它们可能会出现不一致的歧义。

答案 1 :(得分:0)

我会生成一个键列表,并根据长度对它们进行排序(因此&#39; //&#39;将在列表中排在第一位)。一旦你有一个反向排序列表,你可以检查当前正在测试的密钥的字符串的开头,以进行反向翻译。

decodeString = ""
x = "! 4|\/| 31!73"
while len(x) > 0:
    for currentSearch in keys:
        if currentSearch in x[:len(currentSearch)]:
            print(currentSearch)
            decodeString += KEY[currentSearch]
            x = x[len(currentSearch):]

print( decodeString)
I AM ELITE