【问题标题】:How to map characters to integer range [-128, 127] in Python?如何在 Python 中将字符映射到整数范围 [-128, 127]?
【发布时间】:2013-02-26 09:16:19
【问题描述】:

我想将字符列表(表示为单个字节,即范围 [0, 255])转换为范围 [-128,127] 中的整数。我读过 Python 的模运算符 (%) 总是返回一个与分母符号相同的数字。

在 Python 中进行这种转换的正确方法是什么?

编辑ord 映射到[128,255] 的字符应该重新映射到[-128,-1],128 映射到-128,255 映射到-1。 (对于转换的逆我使用chr(my_int%256),但my_int 可以是负数。)

【问题讨论】:

  • 我认为我们需要更多信息来了解您想要做什么。你输入的字符集是什么?总共有 256 个字符吗?它们有连续的序数吗?
  • @sberry 我编辑了我的问题以更好地反映我的意思。
  • 输出数字何时为正数?
  • @christophe31 如果输入字符的ord 在 [0,127] 范围内,则输出为正数。

标签: python range modulo negative-number


【解决方案1】:

我发现我可以通过 struct 模块使用“unpacking from byte”进行此转换:

# gotcha|pitfall: my original idea, but this generates a list of 1-tuples:
# x = [struct.unpack("b",a) for a in charlist]

fmt = "%ib"%len(charlist) # eg. "5b", if charlist's length is 5
x = struct.unpack(fmt,charlist) # tuple of ints

【讨论】:

  • 啊,非常好的解决方案,为胜利签名。
  • 您应该接受自己的答案,因为它是 IMO 的最佳解决方案。
  • @sberry 谢谢;我想等待,但后来我想我会这样做,但是 SO 要求我等待 2 天才能接受我自己的答案。
  • @christophe31 struct.unpack 给出了 2.1 比较了您和 sberry 的答案中的解决方案,两者都给出了 17 左右。这些映射略有不同。黄昏给了〜 14 和地图更不同。
【解决方案2】:

不确定我是否理解了这个问题……你想做这样的事情吗?

[i - 255 if i > 127 else i for i in [ord(l) for l in "azertyuiopqsdféhjklm3{"]]

【讨论】:

    【解决方案3】:
    def to_ints(input):
        return [o if o <= 128 else 255 - o for o in [ord(char) in input]]
    
    def to_str(input):
        return "".join([chr(i%256) for i in input])
    
    out = to_ints("This is a test")
    print to_str(out)
    

    【讨论】:

      【解决方案4】:

      我想知道“字符列表”是什么意思,它们是数字吗?如果是这样,我认为x % 256 - 128x % -256 + 128 应该可以工作。

      【讨论】:

        【解决方案5】:

        这是一个老问题,但对于未来的读者来说,单个整数的直接解决方案是(x + 128)%256 - 128。如果处理 ASCII 字符数据,请将 x 替换为 ord(c)

        % 运算符的结果与x + 128 一致(mod 256);并从中减去 128 使最终结果与 x 一致 将范围移动到 [128,127]。

        这将在生成器表达式中工作,并在 Python 3 中保存一个需要将字符串转换为 bytes 对象的步骤。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-21
          • 2014-01-20
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          • 2014-11-12
          相关资源
          最近更新 更多