gpt4 book ai didi

python - 获取其他两个字符串之间的中点字符串

转载 作者:太空狗 更新时间:2023-10-29 17:20:35 25 4
gpt4 key购买 nike

是否有可用的库或代码片段可以接受两个字符串并返回两个字符串之间的精确或近似中点字符串?

最好使用 Python 编写代码。

背景:

从表面上看这似乎是一个简单的问题,但我正在努力解决它:

  • 显然,“A”和“C”之间的中点字符串将是“B”。
  • 使用 base64 编码,“A”和“B”之间的中点字符串可能是“Ag”
  • 使用 UTF-8 编码时,我不确定有效的中点是多少,因为中间字符似乎是一个控制字符:U+0088 c2 88 <control>

实际应用:

我问的原因是因为我希望编写 map-reduce 类型的算法来从我们的数据库中读取所有条目并处理它们。数据库中的主键是字符随机分布的 UTF-8 编码字符串。我们使用的数据库是 Cassandra。

希望从数据库中获取最低键和最高键,然后通过找到中点将其分成两个范围,然后通过找到它们的每个中点将这两个范围分成两个较小的部分,直到我有几千个部分,然后我可以异步阅读每个部分。

如果字符串是 base-16 编码的示例:(一些中点是近似值):

Starting highest and lowest keys:  '000'                'FFF'                                   /   \              /       \                              '000'     '8'         '8'       'FFF'                              /   \     /  \       /  \       /   \Result:                  '000'    '4' '4'  '8'   '8'  'B8'  'B8'  'FFF'(After 3 levels of recursion)

最佳答案

不幸的是not all sequences of bytes是有效的 UTF-8,因此仅取 UTF-8 值的中点并非易事,如下所示。

def midpoint(s, e):
'''Midpoint of start and end strings'''
(sb, eb) = (int.from_bytes(bytes(x, 'utf-8'), byteorder='big') for x in (s, e))
midpoint = int((eb - sb) / 2 + sb)

midpoint_bytes = midpoint.to_bytes((midpoint.bit_length() // 8) + 1, byteorder='big')
return midpoint_bytes.decode('utf-8')

基本上这段代码将每个字符串转换为一个整数,由内存中的字节序列表示,找到这两个整数的中点,并尝试再次将“中点”字节解释为 UTF-8。

根据您想要的行为,下一步可能是用某种替换字符替换 midpoint_bytes 中的无效字节,以形成有效的 UTF-8 字符串。对于您的问题,只要您保持一致,使用哪个字符进行替换可能并不重要。

但是,由于您正在尝试对数据进行分区并且似乎不太关心中点的字符串表示形式,因此另一种选择是将中点表示形式保留为整数并将键转换为整数,同时做分区。根据您的问题的规模,此选项可能可行也可能不可行。

关于python - 获取其他两个字符串之间的中点字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16752035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com