我试图检查字符串中的连续字符,看它们是否在键盘上相邻。它是我编写的用于评估密码强度的程序的一部分。
我有这个代码将键盘初始化为数组:
KeyboardRow1 = ["`", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "-", "=", ""]
KeyboardRow2 = ["", "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "[", "]", ""]
KeyboardRow3 = ["", "a", "s", "d", "f", "g", "h", "j", "k", "l", ";", "", "", ""]
KeyboardRow4 = ["", "z", "x", "c", "v", "b", "n", "m", ",", ".", "/", "", "", ""]
KeyboardRow1S = ["~", "!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "_", "+", ""]
KeyboardRow2S = ["", "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P", "{", "}", "|"]
KeyboardRow3S = ["","A", "S", "D", "F", "G", "H", "J", "K", "L", ":", "", "", ""]
KeyboardRow4S = ["", "Z", "X", "C", "V", "B", "N", "M", "<", ">", "?", "", "", ""]
Rows = [KeyboardRow1, KeyboardRow2, KeyboardRow3, KeyboardRow4, \
KeyboardRow1S, KeyboardRow2S, KeyboardRow3S, KeyboardRow4S]
然后我有这个函数将输入密码的每个字符转换成键盘数组内的坐标:
def ConvertToCoordinates(Password):
Coordinates = []
for c in Password:
for i, r in enumerate(Rows):
try:
Coordinates.append((i % 4, r.index(c)))
except:
pass
return Coordinates
最后,这是检查邻接的函数 - 我需要帮助的地方:
def CheckForAdjacency(Coordinates):
Adjacent = 0
for pairs in combinations(Coordinates, 2):
if (abs(pairs[0][0] - pairs[1][0]) == 1) \
and (abs(pairs[0][1] - pairs[1][1]) == 1):
Adjacent += 1
return Adjacent
上面的函数检查字符串中每个字符相对于彼此,而不是仅检查字符串中彼此相邻的字符。
例如,我希望qwerty返回5个相邻字符,qetwr返回0.如果qwerty是密码,则该函数确实返回5.但是,如果qetwr是密码,它也返回5;它检查所有字符而不是彼此相邻的字符。
如何才能检查字符串中彼此相邻的字符?我知道问题来自使用&#34;对于组合对#34; ,我认为检查所有可能的配置和配对。
答案 0 :(得分:1)
我认为你确定两个键是否相邻的逻辑并不完全正确。如果两个键相邻(或相同),则它们的x或y坐标不能大于1.
此外,itertools.combinations会生成坐标的所有组合,但您只想计算彼此相邻的坐标。
e.g。 password ='ABCD'组合为您提供'AB AC AD BC BD CD'
def isAdjacent(Coord1, Coord2):
if abs(Coord1[0] - Coord2[0]) > 1 or abs(Coord1[1] - Coord2[1]) > 1:
return False
else:
return True
def CheckForAdjacency(Coordinates):
Adjacent = 0
for i in range(len(Coordinates) - 1):
if isAdjacent(Coordinates[i], Coordinates[i +1]):
Adjacent += 1
return Adjacent