转换为字符串以进行数字排序

Casting to a string for numeric sorting

我有一组数字,我需要生成一个可对这些数字进行排序的字符串哈希。数字可以是整数或浮点数,例如:

-5.75E+100
-4
-1.74E-101
1.74E-101
5
9
11
52.3
5.75E+100

我认为对整数和浮点数进行非指数计算很简单:

                                    # whatever the padding needs to be
>>> sorted(map(lambda x: str(x).zfill(10), [-4, 5, 52.3]))
['-000000004', '0000000005', '00000052.3']

但是,什么是更全面的方法来生成字符串散列,以便对上述数字列表进行正确排序?如果需要,我可以在前面加上指数(或将所有内容转换为指数,如果需要),并在补码中编码负数,如果也需要的话。

你可以试试这个,

nums = sorted(map(eval, data))
nums = list(map(str, nums))
nums

输出-

['-5.75E+100', '-4', '-1.74E-101', '1.74E-101', '5', '52.3', '5.75E+100']

每个 float 对象都有一个 built-in 函数 hex() 可以将其转换为十六进制字符串。这几乎足以制作一个可排序的字符串,但还有一些问题。

首先,负数有前导 - 但正数没有任何内容。您需要为正数添加一个前导字符。

其次,-在排序顺序中+之后。您需要更换一个或另一个才能使顺序正确。

第三,指数在字符串的末尾。它需要移到字符串的前面以使其更重要,但符号需要留在绝对前面。

第四,指数的位数是可变的。它需要用零填充以使其具有一致的大小。

把它们放在一起会产生这样的结果:

def sortable_string(number):
    hex_num = float(number).hex()
    if not hex_num.startswith('-'):
        hex_num = '+' + hex_num
    hex_num = hex_num.replace('-', '!')
    hex_parts = hex_num.split('p')
    exponent = hex_parts[1][0] + hex_parts[1][1:].ljust(4, '0')
    return hex_parts[0][0] + exponent + hex_parts[0][1:]