【问题标题】:Generalizing two similar functions into one将两个相似的函数泛化为一个
【发布时间】:2015-01-07 04:11:23
【问题描述】:

所以下面是一些能够编码和解码句子的 Python 代码。我不确定如何定义一个函数,该函数采用三个参数,可以概括或组合这两个函数:mapInToOutEncode 和 mapInToOutDecode 合二为一。

alphabet = " abcdefghijklmnopqrstuvwxyz"
keyString ="kjihgfedcba zyxwvutsrqponml"

def mapInToOutEncode(inChar):
    index = 0
    found = 0
    for char in alphabet:
        if(char == inChar):
            found = index #remember it in a variable found
        else:
            index +=1
    outChar = keyString[found]
    return(outChar)

def mapInToOutDecode(inChar):
    index = 0
    found = 0
    for char in alphabet:
        if(char == inChar):
            found = index #remember it in a variable found
        else:
            index +=1
    outChar = keyString[found]
    return(outChar)

def encode(inString):
    outString = ''
    for char in inString:
        outString += mapInToOutEncode(char)
    return(outString)

def decode(inString):
    outString = ''
    for char in inString:
        outString += mapInToOutDecode(char)
    return(outString)

print( encode("this is a crazy bit of news to share we attack at dawn" ))
print( decode(encode("this is a crazy bit of news to share we attack at dawn")))

【问题讨论】:

标签: python string python-3.x decode encode


【解决方案1】:

首先,请注意您的函数mapInToOutEncodemapInToOutDecode 是相同的。为了获得您想要的功能,mapInToOutDecode 应该是:

def mapInToOutDecode(inChar):
    index = 0
    found = 0
    for char in keyString:
        if(char == inChar):
            found = index #remember it in a variable found
            break
        else:
            index +=1
    outChar = alphabet[found]
    return(outChar)

请注意,我还添加了单词break,因此您的代码一旦找到它就不会继续寻找inchar

现在,要获得您想要的(mapInToOutEncodemapInToOutDecode 的通用函数),您可以:

def mapInToOut(inChar, alphFrom, alphTo):
    index = 0
    found = 0
    for char in alphFrom:
        if(char == inChar):
            found = index #remember it in a variable found
            break
        else:
            index +=1
    outChar = alphTo[found]
    return(outChar)

编码每个字符a,您可以使用mapInToOut(a, alphabet, keyString)。要解码每个字符b,您可以使用mapInToOut(b, keyString, alphabet)

所以,encodedecode 函数看起来像这样:

def encode(inString):
    outString = ''
    for char in inString:
        outString += mapInToOut(char, alphabet, keyString)
    return(outString)

def decode(inString):
    outString = ''
    for char in inString:
        outString += mapInToOut(char, keyString, alphabet)
    return(outString)


这是一个完整工作示例(即,这应该是您的全部代码):
alphabet = " abcdefghijklmnopqrstuvwxyz"
keyString ="kjihgfedcba zyxwvutsrqponml"

def mapInToOut(inChar, alphFrom, alphTo):
    index = 0
    found = 0
    for char in alphFrom:
        if(char == inChar):
            found = index #remember it in a variable found
            break
        else:
            index +=1
    outChar = alphTo[found]
    return(outChar)

def encode(inString):
    outString = ''
    for char in inString:
        outString += mapInToOut(char, alphabet, keyString)
    return(outString)

def decode(inString):
    outString = ''
    for char in inString:
        outString += mapInToOut(char, keyString, alphabet)
    return(outString)

print ("this is a crazy bit of news to share we attack at dawn")
encoded_msg = encode("this is a crazy bit of news to share we attack at dawn")
print encoded_msg
print decode(encoded_msg)

【讨论】:

  • 感谢您指出!当我将 "outChar = keyString[found]" 中的 keyString 更改为字母表时,我从编码和解码得到的输出现在完全一样!而且当我使用您的更改运行它时,它会显示“NameError:未定义全局名称'alpFrom'”......?
  • 那是我 print( encode("这是一个疯狂的新闻分享我们在黎明攻击" )) 和 print( decode(encode("这是一个疯狂的新闻分享我们在黎明攻击"))),我得到 rcbskbskjkhtjlmkibrkwekxfoskrwkscjtfkofkjrrjh kjrkgjox 用于两个打印语句....
  • 我没有在任何地方写过alpFrom。你是用 `ctrl+c , ctrl+v' 复制我的代码还是重新输入?我想你可能抄错了。确保您的代码与我的完全一样(这也适用于您的其他问题)。
  • 它不工作......所以我有 mapInToOut 部分,我还保留了 def encode(inString) 和 def decode(inString) 部分,我是否将我的 for 循环更改为“outString + = mapInToOut(char,alphabet,keyString)" ?
  • 我编辑了我的代码以更好地阐明它。它工作正常,我刚刚测试过。
【解决方案2】:

尝试使用字典进行编码/解码,它将大大简化您的代码:

>>> alphabet = " abcdefghijklmnopqrstuvwxyz"
>>> keyString ="kjihgfedcba zyxwvutsrqponml"
>>> encoder = dict(zip(alphabet, keyString))
>>> decoder = dict(zip(keyString, alphabet))
>>> a = 'this is a string'
>>> q = ''.join(encoder.get(i, i) for i in a)
>>> q
'rcbskbskjksrtbxd'
>>> ''.join(decoder.get(i, i) for i in q)
'this is a string'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2022-06-30
    • 1970-01-01
    • 2017-01-17
    • 2021-09-05
    相关资源
    最近更新 更多