我正在尝试编写一个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)