本题摘自《Python编程300例--快速构建可执行高质量代码》,在本篇中将引用书内提供的解法,我个人初学时的解法(6月份),以及学了列表解析后的一行解法(7月份),原本七八行还有很复杂的过程在今天只用一句代码就解决了,很烧脑,但太有意思了!!!
1.问题描述 给定一个单词列表,返回可以在键盘(如图1-1所示)的一行上使用字母键输入的单词。 可以多次使用键盘中的一个字符,输入字符串仅包含字母表的字母。
2.问题示例 输入["Hello","Alaska","Dad","Peace"],输出["Alaska","Dad"],即这两个单词 可以在键盘的第3行输出。
#书上的写法 print('----------------------书上的写法----------------------') class Solution: #参数words:字符串列表 #返回字符串列表 def findWords(self,words): res=[] s=["qwertyuiop","asdfghjkl","zxcvbnm"] for w in words: for j in range(3): flag=1 for i in w: if i.lower() not in s[j]: #这个判断方法非常巧妙,再配合下方两个break,真是太聪明了 flag=0 break if flag==1: res.append(w) break return res if __name__== '__main__': word=["Hello","Alaska","Dad","Peace"] s=Solution() print("输入:",word) print("输出:",s.findWords(word))
#我最初的想法是设置三个循环加三个参考数来判断是否等长于字符串,以确认满足条件,但代码多且复杂 kb=["qwertyuiop","asdfghjkl","zxcvbnm"] cz=["Hello","Alaska","Dad","Peace","quIte","toP","CV"] lst=[] print('--------------最初的思路-------------------') for i in range(len(cz)): a=cz[i] m = 0 for j in range(len(kb)): b=kb[j] for x in a: if x.lower() not in b: #如果没在b的字符串内,直接跳过,因为只要有一个没在这个范围,就不符合题目要求 break else: m+=1 #如果找一个在这个范围,则记录下,然后继续遍历核对 continue if m==len(a): #当合计完的m值和字符长度一样,就说明整个字符都在范围内,故按题目要求输出 lst.append(a) print(lst) print('-------------2022年6月仿书上的写法-------------------') lst=[] for w in cz: for x in range(len(kb)): mymark=1 for y in w: if y.lower() not in kb[x]: #书上用的这个方法大大缩减了代码量 mymark=0 break # 这两个break用的非常妙 if mymark==1: lst.append(w) break # 这两个break用的非常妙 print(lst)
#2022.7.29晚上复习时,想到的变通办法: 直接并列三个条件判断
lst=[] for b in range(len(cz)): a=cz[b] if all([x.lower() in kb[0] for x in a]) or all([x.lower() in kb[1] for x in a]) \ or all([x.lower() in kb[2] for x in a]) : lst.append(a) print(lst)
print('-----应用列表解析的写法: 一行代码即可解决-------感觉自己真的有在提升^_^-----') kb=["qwertyuiop","asdfghjkl","zxcvbnm"] cz=["Hello","Alaska","Dad","Peace","quIte","toP","CV"] print([ x for x in cz for i in range(len(kb)) if all([y.lower() in kb[i] for y in x]) ]) #按cz的顺序 print([ x for i in range(len(kb)) for x in cz if all([y.lower() in kb[i] for y in x]) ]) #按kb的顺序
'''
补充一下输出结果:
--------------最初的思路-------------------
['Alaska', 'Dad', 'quIte', 'toP', 'CV']
-------------2022年6月仿书上的写法-------------------
['Alaska', 'Dad', 'quIte', 'toP', 'CV']
----------------------书上的写法----------------------
输入: ['Hello', 'Alaska', 'Dad', 'Peace']
输出: ['Alaska', 'Dad']
-------------7月复习时的写法: 一行流----------------------
['Alaska', 'Dad', 'quIte', 'toP', 'CV']
['quIte', 'toP', 'Alaska', 'Dad', 'CV']
---2022.7.29晚想到的变通办法: 直接并列三个条件判断-------
['Alaska', 'Dad', 'quIte', 'toP', 'CV']
Process finished with exit code 0
'''