【问题标题】:Converting string to integer and vice versa in Python在 Python 中将字符串转换为整数,反之亦然
【发布时间】:2021-05-10 17:06:15
【问题描述】:

例如我有一个字符串

>>> sample = "Hello World!"

我想做一个可以将sample 转换为int 的函数。我知道chr()ord()。到目前为止我用过这个:

字符串转整数

>>> res="".join([str(ord(char)) for char in sample])
>>> print(res)
72101108108111328711111410810033

现在问题出现了。如何将res 转换回sample。任何建议将不胜感激。

Note: sample string can also have unicode characters in it

编辑:

nchars=len(sample)
res = sum(ord(sample[byte])<<8*(nchars-byte-1) for byte in range(nchars)) # string to int
print(''.join(chr((res>>8*(nchars-byte-1))&0xFF) for byte in range(nchars))) #int to string

我找到了这个解决方案,但是速度很慢,有人知道要改进吗

【问题讨论】:

  • 这是不可能的,因为数字的长度不同(确切地说是数字字符串),没有人能分辨出哪个数字属于哪个数字。
  • @MichaelButscher 我找到了解决方案,但速度很慢。你能告诉我在编辑中更好的解决方案吗
  • 如何在解决方案中对字符串使用位移运算符?
  • 将所有 ASCII 组合在一起形成一个大字符串。你知道 ASCII 值有不同的大小,比如0~255,那么你怎么能确定你需要什么字符呢?避免将所有 ASCII 组合在一起,而是使用 ASCII 列表然后转换为字符串。此外,您编辑的问题不是返回的有效方式
  • @SayanipDutta 通过将字符串转换为字节

标签: python string type-conversion integer


【解决方案1】:
sample = "Hello World!"
d1={k:str(ord(v)) for k,v in list(enumerate(sample))}
''.join(d1.values())
'72101108108111328711111410810033'
res1="".join([chr(int(char)) for char in d1.values()])
res1
'Hello World!'

为了避免which ord(chr) belongs to which chr? 的问题,我们需要一个类似数据结构的映射,而dict 是存储每个字符串的最佳方式,并使用enumerate 将它们分配给唯一键,这将动态生成键。

我们的d1 看起来像这样:

{0: '72',
 1: '101',
 2: '108',
 3: '108',
 4: '111',
 5: '32',
 6: '87',
 7: '111',
 8: '114',
 9: '108',
 10: '100',
 11: '33'}

然后是简单的部分,将字符串值转换为 int 并在其上应用 chr 以转换回字符串。

由于OP 不想使用多个变量或数据结构。

sample = "Hello World!"
l_n=[str(ord(i))+str(ord('@')) for i in list(sample)]
text="".join(l_n)
n_l=[chr(int(i)) for i in text.split('64') if i.isnumeric()]
''.join(n_l)

问题是我们需要知道在哪里应用char,所以我在每个字母中添加了一个额外的@,以便将其转换回来

【讨论】:

  • 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并最终将这些知识应用到他们自己的代码中。在解释代码时,您也可能会得到用户的积极反馈/赞成。
  • @Ajay 感谢您的回答,但我在这里必须将 d1 字典与数字数据一起存储。您可以认为我必须在一台 PC 中将字符串转换为 int,在另一台 PC 中将 int 转换为字符串。我必须存储有限数量的数据。你能建议我任何其他方式。谢谢
  • @YashMakan 一旦生成了d1,这在其他 PC 上不是必需的
  • @Ajay 考虑行res1="".join([chr(int(char)) for char in d1.values()])。您已使用 d1 将 int 转换回字符串。因此在这种情况下我必须存储 d1 和 int...
【解决方案2】:

我正在保存以“”分隔的数字,因此可以更轻松地通过转换返回

这很有效,而且很简单:

i = "Hello World"
num = ""
for char in i:
    num += str(ord(char))+" "

print(''.join(num.split()))

back = ""
for n in num.split():
    back += chr(int(n))

print(back)

输出:

721011081081113287111114108100
Hello World

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-16
    • 2011-05-27
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多