【问题标题】:How can I sort a string based on the ASCII value of the characters如何根据字符的 ASCII 值对字符串进行排序
【发布时间】:2021-11-25 20:58:37
【问题描述】:

我正在尝试创建一个程序,该程序可以获取字符串并返回按其 ASCII 值排序的字符的字符串(例如:“Hello, World!”应该返回“!,HWdellloor”)。

我试过了,效果很好:

text = "Hello, World!"
cop = []
for i in range(len(text)):
    cop.append(ord(text[i]))
cop.sort()
ascii_text = " ".join([str(chr(item)).strip() for item in cop])
print(ascii_text)

但我很想知道仅使用字符串操作函数是否可以实现这样的事情。

【问题讨论】:

  • 为什么?为什么不直接排序字符?此外,在 Python 3 中,字符串是 Unicode 而不是 ASCII。
  • ''.join(sorted(text))。字符串是一个序列。调用ord() 是不必要的(它不会改变转换为整数的排序顺序)。
  • @PanagiotisKanavos 确实,但我希望根据 ascii 值进行排序
  • @DietrichEpp 谢谢,现在我觉得自己很愚蠢,但至少它起作用了 xd
  • 旁注:更容易创建copcop = [ord(c) for c in text]。另外,str(chr()) 是多余的。

标签: python python-3.x string ascii


【解决方案1】:

Ascii 是 Unicode 的一个子集。 Unicode 的前 127 个代码点与 ascii 的前 127 个代码点相同(尽管在 1963 年发明 ascii 时,它们没有使用 codepoint 这个词)。所以如果你的数据都是ascii,你只要调用内置的sort()方法或者sorted()函数,就可以按ascii顺序获取。

像这样:

>>> text = "Hello, World!"
>>> ''.join(sorted(text))
' !,HWdellloor'

结果是按字符的 Unicode 码位排序的,但由于与 ascii 码位相同,所以没有区别。

如您所见,排序结果中的第一个字符是空格,ascii 32,它是具有最低码位的可打印字符,32(是的,您可以争论是否可打印)后跟数字(码位48-57),然后是大写字母(65-90),然后是小写字母(97-122),标点和符号散布在中间的间隙中,以及回车和换行等控制代码在0-31和127.

您可以通过排序string.ascii_letters来确认这一点:

>>> import string
>>> ''.join(sorted(string.ascii_letters))
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'

然后根据可用的one of the many ascii 表检查序列。

如果您想知道各种字符块的位置,大写和小写的排列方式使得大写字符(例如 A:0x41)和相应的小写字符之间存在一位差异字符(a: 0x61),简化了不区分大小写的匹配;对于其他块的放置也有类似的论据。对于一些控制代码,有很强的遗留要求,来自打孔纸带图案。

【讨论】:

    猜你喜欢
    • 2021-11-09
    • 2015-08-13
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2021-12-20
    相关资源
    最近更新 更多