转换为字符串以进行数字排序
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:]
我有一组数字,我需要生成一个可对这些数字进行排序的字符串哈希。数字可以是整数或浮点数,例如:
-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:]