【问题标题】:Given a number and two lists whose values at each index correspond, how to decode an iteger?给定一个数字和两个列表,其每个索引处的值对应,如何解码一个整数?
【发布时间】:2023-02-15 23:28:37
【问题描述】:

我面临的问题是我的解码器功能。据我所知,我正确地编码了这个值;但是,它不会解码回给定的字符串。我提供了一个在 encoder() 块中使用的编码过程和方程的示例。

从我提供的代码中你会看到,我尝试使用val % 4,得到余数,然后减去1得到索引;但是,返回的字符串与我编码的字符串不同。

这是我的程序的当前状态:

import numpy as np

alphabet = {
        'a': 1,
        'b': 2,
        'c': 3,
        'd': 4
    }

def encoder(val):
    """
    Params:
        val(string): string that we are going to encode must be length 5 or less
    Alphabet and corresponding values:
        alphabet: {a b c d}
        values: {1 2 3 4} -> for encoding
    Returns:
        econded_value(int)
    """

    # example: babca
    # encoded: (2 x (4^4)) + (1 x (4^3)) + (2 x (4^2)) + (3 x (4^1)) + (1 x (4^0))

    encoded_val = 0
    power = len(val) - 1 # keeps track of what value we need to put 4 to the power of

    # to encode we need to loop over the string
    for i in range(len(val)):
        encoded_val += ((4**power) * alphabet[val[i]])
        power -= 1

    return encoded_val


def decoder(val):
    r_string = ""

    # convert dictionary to two lists so we can access the keys (letters) using the values (numbers) thus making the decoded string
    letter_list = list(alphabet.keys())
    number_list = list(alphabet.values())

    print(letter_list, number_list)

    while val > 0:
        r_string += letter_list[number_list[(val%4)-1]]
        val = val // 4

    return r_string


if __name__ == '__main__':

    val = encoder("babca")

    print(decoder(val))

【问题讨论】:

  • val%4 将产生 0、1、2 或 3 的值;从中减去 1 会将范围变为 -1、0、1 或 2。这真的是您想要的吗?添加1 似乎更有可能在这里工作。
  • @jasonharper (val%4)-1 用作字母表值的索引。例如。 0 映射到 1,后者映射到 'a'。有点令人费解,但这不是错误。
  • 将 1 到 4 作为字母表的值,然后使用 %4 进行解码,将会出现问题。想想十进制数。我们可以连续执行 n%10 来获取单个数字,但我们的数字是 0 到 9,而不是 1 到 10。
  • 我看到的最大问题是代码的长度。由于您使用 1-4 编码 4 个字母,4 是 0b1004^n 对于 n 的每个增量仅移动 2,一旦您想写 d,您将开始覆盖以前编写的代码字母。

标签: python list math decoding


【解决方案1】:

虽然我在评论中提到的问题仍然存在,但问题出在这段代码中:

letter_list = list(alphabet.keys())
number_list = list(alphabet.values())

由于您的字典将 'a' 映射到 1,将 'b' 映射到 2 等,因此您希望列表也是如此。但是,字母列表将索引 0 映射到 'a',将 1 映射到 'b' 等。

要解决此问题(以最快但最丑陋的方式),您需要从此处的索引中减去一个:

r_string += letter_list[number_list[(val%4)-1]-1]

但是,字符串是反向的,所以不要忘记将其反向:

return r_string[::-1]

给出以下输出字符串:

babca

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2020-03-02
    • 1970-01-01
    • 2021-06-15
    • 2019-10-24
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多