字母/词典ord中两个字符串的平均值

2024-05-13 10:15:21 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您使用字符串“a”和“z”,并按字母顺序列出它们之间的所有字符串:['a'、'b'、'c'…'x’,‘y’,‘z’]。取这个列表的中点,你就会找到'm'。这有点像取这两条弦的平均值。在

您可以将其扩展到包含多个字符的字符串,例如,“aa”和“zz”之间的中点将位于列表的中间[“aa”、“ab”、“ac”…”zx’,‘zy’,‘zz’]。在

有没有一个Python方法可以做到这一点呢?如果没有,即使知道算法的名称也会有帮助。在

我开始制定自己的程序,简单地遍历两个字符串并找到第一个不同字母的中点,这在“aa”和“az”的中点是“am”时似乎很有效,但在“cat”、“doggie”的中点(它认为是“c”)上失败了。我试着在google上搜索“二进制搜索字符串中点”等,但不知道我要做什么的名字,我没有什么运气。

我添加了自己的解决方案作为答案


Tags: 方法字符串算法列表ab顺序字母字符
3条回答

如果你的意思是按字母顺序,只需使用FogleBird的算法,但要颠倒参数和结果!在

>>> print average('cat'[::-1], 'doggie'[::-1])[::-1]
cumdec

或者像这样重写average

^{pr2}$

这听起来像你想要的,就是把字母字符作为一个介于0和1之间的以26为底的值。当你有不同长度的字符串(以10为基数的例子),比如305和4202,你的中间点是3,因为你一次只看一个字符。相反,将它们视为浮点尾数:0.305和0.4202。从这一点,很容易得出一个0.3626的中点(如果你愿意,你可以四舍五入)。在

以26为基数(a=0…z=25,ba=26,bb=27等)进行字母计算:

cat变为'a.cat',doggie变为'a.doggie',计算得出cat的十进制值为0.078004096,doggie的值为0.136390697,平均值为0.107197397,以26为基数大致为“cumcqo”

如果你定义了一个字符的字母表,你只需转换成以10为基数,再进行平均,再转换回base-N,其中N是字母表的大小。在

alphabet = 'abcdefghijklmnopqrstuvwxyz'

def enbase(x):
    n = len(alphabet)
    if x < n:
        return alphabet[x]
    return enbase(x/n) + alphabet[x%n]

def debase(x):
    n = len(alphabet)
    result = 0
    for i, c in enumerate(reversed(x)):
        result += alphabet.index(c) * (n**i)
    return result

def average(a, b):
    a = debase(a)
    b = debase(b)
    return enbase((a + b) / 2)

print average('a', 'z') #m
print average('aa', 'zz') #mz
print average('cat', 'doggie') #budeel
print average('google', 'microsoft') #gebmbqkil
print average('microsoft', 'google') #gebmbqkil

编辑:根据评论和其他答案,您可能需要处理不同长度的字符串,方法是将字母表的第一个字母附加到较短的单词上,直到长度相同为止。这将导致“平均值”落在词典排序的两个输入之间。下面是代码更改和新输出。在

^{pr2}$

相关问题 更多 >