6

尝试从 Python 中的 UTF-8 编码字符串对象获取双精度浮点分数。这个想法是获取字符串的前 8 个字节并创建一个float,这样字符串,按它们的分数排序,将根据它们的前 8 个字节(或者可能是它们的前 63 位,在强制它们全部为正以避免符号错误)。

例如:

get_score(u'aaaaaaa') < get_score(u'aaaaaaab') < get_score(u'zzzzzzzz')

我尝试使用左移和 XOR 以整数形式计算分数,但我不确定如何将其转换为float值。我也不确定是否有更好的方法来做到这一点。

应该如何计算字符串的分数以便满足我之前指定的条件?

编辑:字符串对象是 UTF-8 编码的(根据@Bakuriu 的评论)。

4

2 回答 2

3

float不会给你 64 位的精度。请改用整数。

def get_score(s):
  return struct.unpack('>Q', (u'\0\0\0\0\0\0\0\0' + s[:8])[-8:])[0]

在 Python 3 中:

def get_score(s):
  return struct.unpack('>Q', ('\0\0\0\0\0\0\0\0' + s[:8])[-8:].encode('ascii', 'error'))[0]

编辑:

对于floats,有 6 个字符:

def get_score(s):
  return struct.unpack('>d', (u'\0\1' + (u'\0\0\0\0\0\0\0\0' + s[:6])[-6:]).encode('ascii', 'error'))[0]
于 2013-10-23T18:55:52.663 回答
1

您将需要设置整个字母表并手动进行转换,因为转换为 base > 36 不是内置的,为此您只需定义要使用的完整字母表。例如,如果它是一个 ascii 字符串,您将使用所有 ascii 表作为字母表,从输入字符串创建一个以 256 为基数的 long 的转换。

您在这里有一个完整功能的示例:string to base 62 number

此外,这样做时您不必担心负正数,因为使用字母表中的第一个字符对字符串进行编码将产生表示中可能的最小数字,即具有最高绝对值的负值,在您的情况下 -2**63 这是正确的值,并允许您对它使用 < > 。

希望能帮助到你!

于 2013-10-23T20:11:08.763 回答