▶例18 键盘的一行 (用一行代码完成)

本题摘自《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
'''

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值