鱼C论坛

 找回密码
 立即注册
查看: 2659|回复: 7

[已解决]list中寻找连续出现的位置

[复制链接]
发表于 2021-6-28 03:53:22 | 显示全部楼层 |阅读模式

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

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

x
求教,在一个list中,想找到连续2次或3次或4次(连续出现次数可根据输入值变化)True的位置。
例如a = [False, True, True, True, False, True, True, True, True, False] 。这个list的答案应该是[[1, 3],[5,4]]。
或者[False] * 3。答案应该是[]。
再或者[True, True, False, False, True, True, True, True, True, False, False, True, True] 。答案应该是[[0, 2],[4,5],[11,2]]。
该怎样编写?
最佳答案
2021-6-28 09:05:56
本帖最后由 qq1151985918 于 2021-6-28 09:13 编辑

  1. def fun(data: list) -> list:
  2.     results, result = [], [None, 0]
  3.     for i in range(len(data)):
  4.         if data[i]:
  5.             if result[0] is None:
  6.                 result[0] = i
  7.                 result[-1] += 1
  8.             else:
  9.                 result[-1] += 1
  10.         else:
  11.             if result[0] is not None and result[-1] >= 2:
  12.                 results.append(result)
  13.             result = [None, 0]
  14.     else:
  15.         if result[0] is not None and result[-1] >= 2:
  16.             results.append(result)
  17.     return results


  18. if __name__ == "__main__":
  19.     a = [True, True, False, False, True, True, True, True, True, False, False, True, True]
  20.     print(fun(a))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-6-28 09:05:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qq1151985918 于 2021-6-28 09:13 编辑

  1. def fun(data: list) -> list:
  2.     results, result = [], [None, 0]
  3.     for i in range(len(data)):
  4.         if data[i]:
  5.             if result[0] is None:
  6.                 result[0] = i
  7.                 result[-1] += 1
  8.             else:
  9.                 result[-1] += 1
  10.         else:
  11.             if result[0] is not None and result[-1] >= 2:
  12.                 results.append(result)
  13.             result = [None, 0]
  14.     else:
  15.         if result[0] is not None and result[-1] >= 2:
  16.             results.append(result)
  17.     return results


  18. if __name__ == "__main__":
  19.     a = [True, True, False, False, True, True, True, True, True, False, False, True, True]
  20.     print(fun(a))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-28 15:43:24 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-6-28 19:46 编辑
  1. # 思路:将False看做是括号,那么两个False之间,若为连续的True就可以很好地判断了

  2. # 代码实现:
  3. a = [False, True, True, True, False, True, True, True, True, False]
  4. # a = [True, True, True, False, True, False, True, True, True]  # 测试
  5. a = [True, True, False, False, True, True, True, True, True, False, False, True, True]

  6. # 前后插入False,确保 True被False“包住”
  7. a.insert(0, False)
  8. a.append(False)

  9. # 转为01字符串,以便于后面写判断
  10. s = ''.join([str(int(i)) for i in a])  
  11. print(s)

  12. # 确定False('0')出现的位置
  13. fs = [i for i in range(len(s)) if s[i]=='0']  
  14. print(fs)

  15. # 根据前后两个False出现的位置,判断其之间 是否包着 连续的True('1')
  16. lx = ['1'*(n+1) for n in range(int(input("True的最大连续次数为:")))]
  17. result = []
  18. for stop in fs:
  19.     for start in fs:
  20.         ss = s[int(start) + 1 :int(stop)]
  21.         if ss in lx:  # 如 '11', '111', '1111'
  22.             # print([start, ss])
  23.             result.append([start, len(ss)])   
  24.             # 注:正确的开始位置 本应该是 start+1,但我们一开始在 insert()的False,所以这里抵消了, 故是 start

  25. print(result)
复制代码





修改:有点偏差局限了,需改一下 去掉lx不用; 将 if ss in lx:  改为  if '0' not in ss and len(ss) >=2 :

OK。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-28 23:25:40 | 显示全部楼层

你好,如果我想改变原来2个连续就计入变为3个连续才计入,该怎么做?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-6-28 23:27:20 From FishC Mobile | 显示全部楼层
xzc_98 发表于 2021-6-28 23:25
你好,如果我想改变原来2个连续就计入变为3个连续才计入,该怎么做?


代码里的所有2改成3就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-6-28 23:29:03 | 显示全部楼层
qq1151985918 发表于 2021-6-28 23:27
代码里的所有2改成3就好了

谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 21:21:59 From FishC Mobile | 显示全部楼层
还有别的方法不
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 21:22:31 From FishC Mobile | 显示全部楼层
这刚开始result这步没看懂啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-16 02:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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