鱼C论坛

 找回密码
 立即注册
查看: 2472|回复: 8

[已解决]第20讲课后作业寻找隐藏密码可否使用filter方法解决?

[复制链接]
发表于 2020-2-18 12:36:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 请用已学过的知识编写程序,找出小甲鱼藏在下边这个长字符串中的密码,密码的埋藏点符合以下规律:
    a) 每位密码为单个小写字母
    b) 每位密码的左右两边均有且只有三个大写字母

  1. def find_keyword(str1):
  2.     list1=[]
  3.     end=len(str1)-4
  4.     for i in range(4,end):
  5.         if (str1[i]+str1[i-4]+str1[i+4]).islower():
  6.             if (str1[i-3:i]+str1[i+1:i+4]).isupper():
  7.                 print(i)
  8.                 list1.append(str1[i])
  9.     return list1
  10. str1='''..........................................'''
  11. str1='' . join(str1 . split('\n'))
  12. print(find_keyword(str1))
复制代码


这个是我之前写的代码,想用filter方法改进的思路是:符合条件的密码为‘’aAAAaAAAa‘’格式,filter方法过滤的规则是小写字母,然后如果过滤出来的小写字母的位置是【0】,【4】,【8】那么中间的‘’a‘’就是其中一个密码字符
实现难点:

1.filter()返回的是可迭代对象的值(不是所在位置)

2.islower()这个不能直接拿来作为函数用?要先def一个判断小写字母的函数出来?

以上问题请各位大神解答~~
最佳答案
2020-2-18 12:36:09
zzong2019 发表于 2020-2-18 12:51
运行出来可以实现,那这道题我不用filter实现了,但我还是想知道,filter()返回的是可迭代对象的值(不 ...

可以这样:

  1. >>> list1 = [1, 2, 3, 4, 5]
  2. >>> list2 = list(zip(range(len(list1)), list1))
  3. >>> list3 = list(filter(lambda x: x[1] % 2 == 0, list2))
  4. >>> list3
  5. [(1, 2), (3, 4)]
  6. >>> # 第一个元素是在原列表的位置,第二个是值
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 12:39:27 From FishC Mobile | 显示全部楼层
可是要有多个符合条件的??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 12:42:29 | 显示全部楼层
虽然用 filter 能实现,但是过于麻烦,所以不用 filter 。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-18 12:44:12 | 显示全部楼层
zltzlt 发表于 2020-2-18 12:42
虽然用 filter 能实现,但是过于麻烦,所以不用 filter 。

好的,那么您觉得我写的那种判断方式是不是很low啊?但是小甲鱼的答案又过于繁琐了!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 12:45:05 | 显示全部楼层
zzong2019 发表于 2020-2-18 12:44
好的,那么您觉得我写的那种判断方式是不是很low啊?但是小甲鱼的答案又过于繁琐了!


不 low,这是正常人的写法不过你这种方法能正确实现吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-18 12:51:21 | 显示全部楼层
zltzlt 发表于 2020-2-18 12:45
不 low,这是正常人的写法不过你这种方法能正确实现吗?

运行出来可以实现,那这道题我不用filter实现了,但我还是想知道,filter()返回的是可迭代对象的值(不是所在位置),如果想实现返回符合条件的字符对应的位置怎么办,还有islower()这个方法在filter中不能直接拿来作为函数用(第一个参数)?要先def一个判断小写字母的函数出来?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 12:36:09 | 显示全部楼层    本楼为最佳答案   
zzong2019 发表于 2020-2-18 12:51
运行出来可以实现,那这道题我不用filter实现了,但我还是想知道,filter()返回的是可迭代对象的值(不 ...

可以这样:

  1. >>> list1 = [1, 2, 3, 4, 5]
  2. >>> list2 = list(zip(range(len(list1)), list1))
  3. >>> list3 = list(filter(lambda x: x[1] % 2 == 0, list2))
  4. >>> list3
  5. [(1, 2), (3, 4)]
  6. >>> # 第一个元素是在原列表的位置,第二个是值
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-18 12:58:33 | 显示全部楼层
zzong2019 发表于 2020-2-18 12:51
运行出来可以实现,那这道题我不用filter实现了,但我还是想知道,filter()返回的是可迭代对象的值(不 ...

islower() 可以用啊

  1. >>> str1 = "abcABCdefDEF"
  2. >>> str2 = "".join(filter(lambda x: x.islower(), str1))
  3. >>> print(str2)
  4. abcdef
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-2-18 13:00:13 | 显示全部楼层

明白!非常感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-3-2 21:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表