Python代码来检查输入字符串是否可以用单行键盘(例如:potter,flash)编写



我正在尝试编写一个Python代码来检查是否可以仅使用键盘的一行(例如POTTER,EQUITY(键入给定的单词。如果单词的字母来自一行,请打印"是",否则打印"否"。

这是我的代码(没有得到所需的输出(

row1='qwertyuiop'
row2='asdfghjkl'
row3='zxcvbnm'
i=0
j=0
status='no'
st=input('enter a string : ')
if st[0] in row1:
while(i<len(st)):
while(j<len(row1)):
if(st[i]==row1[j]):
status='yes'
i+=1
j=0
elif(j==(len(st)-1)):
status='no'
break
else:
j+=1
j=0
i=0
elif st[0] in row2:
while(i<len(st)):
while(j<len(row2)):
if(st[i]==row2[j]):
status='yes'
i+=1
j=0
elif(j==(len(st)-1)):
status='no'
break
else:
j+=1
j=0
i=0
else: 
while(i<len(st)):
while(j<len(row3)):
if(st[i]==row3[j]):
status='yes'
i+=1
j=0
elif(j==(len(st)-1)):
status='no'
break
else:
j+=1    
print(status)

我添加了一些大写,数字和特殊字符的处理:

def keyboard_test(string, ignore_unk = True):
string = string.lower()
rows = ['qwertyuiop','asdfghjkl','zxcvbnm']
# rows = ['!@#$%^&*()_+1234567890-=','qwertyuiop[]\{}|','asdfghjkl;:"'+"'",'zxcvbnm,<.>/?']
key_dict = {}
for index, row in enumerate(rows):
for i in row:
if i in string:
key_dict[i] = index
string_char_rows = [key_dict[i] if i in key_dict else "Unk" for i in string]
if ignore_unk:
string_char_rows = [i for i in string_char_rows if i != "Unk"]
# return len(set(string_char_rows)) <= 1 # returns True/False, likely more useful
if len(set(string_char_rows)) <= 1:
return "Yes"
return "No"

如果它们都在一行中,则返回 Yes

keyboard_test("EQUITY")
Yes

使用集合,可以有效地完成此操作。

输入中的字符集必须是某行的子集。

def writable_in_one_line(word):
rows = (
set('qwertyuiop'),
set('asdfghjkl'),
set('zxcvbnm'))
chars = set(word.lower())
return any(chars <= row for row in rows)

word = input('Word: ')
print('Yes' if writable_in_one_line(word) else 'No')

输出

Word: POTTER
Yes

如果,正如你提到的,你不允许在你的课堂上使用set。然后有一个仅使用字符串的性能较低的解决方案。

def writable_in_one_line(word):
rows = (
'qwertyuiop',
'asdfghjkl',
'zxcvbnm')
chars = word.lower()
return any(all(c in row for c in chars) for row in rows)

相关内容

最新更新