我正在编写一个电缆映射脚本,该脚本需要找到最近的交换机。因此,如果配线架位于机架08AB中,而机架08AC和08AD中有一个开关,则我需要它来选择最近的(08AC)。问题是机架编号顺序。前两位数字始终相同(08),字母递增。但是他们先增加A-Z,再增加AA-AZ。因此,如果面板位于08Z机架中,则08AA比08X更近。
我通过将字母转换为数字并查看最接近的字母来完成这项工作,但似乎笨拙,我想知道是否有更好的方法:
sigma
这提供了我想要的最接近的开关08AA。我的问题是,有更好的方法吗?
答案 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