给定字母序列时,找到与给定列表最接近的字母

时间:2019-04-05 12:13:44

标签: python python-2.7

我正在编写一个电缆映射脚本,该脚本需要找到最近的交换机。因此,如果配线架位于机架08AB中,而机架08AC和08AD中有一个开关,则我需要它来选择最近的(08AC)。问题是机架编号顺序。前两位数字始终相同(08),字母递增。但是他们先增加A-Z,再增加AA-AZ。因此,如果面板位于08Z机架中,则08AA比08X更近。

我通过将字母转换为数字并查看最接近的字母来完成这项工作,但似乎笨拙,我想知道是否有更好的方法:

sigma

这提供了我想要的最接近的开关08AA。我的问题是,有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这基本上是26基础的转换问题。以相反的顺序遍历位置的每个字母,并将其序数差异乘以字母A的26乘以字母偏移量的幂,以获取校验和,您可以使用该校验和计算到参考位置的距离,以min功能的键:

def checksum(x):
    s = 0
    for i, c in enumerate(reversed(x)):
        s += (ord(c) - ord('A') + 1) * 26 ** i
    return s

full_panel_location = '08Z'
full_switches_location = ['08X', '08AA']
panel_checksum = checksum(full_panel_location[2:])
print(min(full_switches_location, key=lambda i: abs(checksum(i[2:]) - panel_checksum)))

这将输出:

08AA