鱼C论坛

 找回密码
 立即注册
查看: 2420|回复: 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 编辑

def fun(data: list) -> list:
    results, result = [], [None, 0]
    for i in range(len(data)):
        if data[i]:
            if result[0] is None:
                result[0] = i
                result[-1] += 1
            else:
                result[-1] += 1
        else:
            if result[0] is not None and result[-1] >= 2:
                results.append(result)
            result = [None, 0]
    else:
        if result[0] is not None and result[-1] >= 2:
            results.append(result)
    return results


if __name__ == "__main__":
    a = [True, True, False, False, True, True, True, True, True, False, False, True, True]
    print(fun(a))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

def fun(data: list) -> list:
    results, result = [], [None, 0]
    for i in range(len(data)):
        if data[i]:
            if result[0] is None:
                result[0] = i
                result[-1] += 1
            else:
                result[-1] += 1
        else:
            if result[0] is not None and result[-1] >= 2:
                results.append(result)
            result = [None, 0]
    else:
        if result[0] is not None and result[-1] >= 2:
            results.append(result)
    return results


if __name__ == "__main__":
    a = [True, True, False, False, True, True, True, True, True, False, False, True, True]
    print(fun(a))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

# 代码实现:
a = [False, True, True, True, False, True, True, True, True, False]
# a = [True, True, True, False, True, False, True, True, True]  # 测试
a = [True, True, False, False, True, True, True, True, True, False, False, True, True] 

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

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

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

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

print(result)




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

OK。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你好,如果我想改变原来2个连续就计入变为3个连续才计入,该怎么做?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


代码里的所有2改成3就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 21:21:59 From FishC Mobile | 显示全部楼层
还有别的方法不
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-12 21:22:31 From FishC Mobile | 显示全部楼层
这刚开始result这步没看懂啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 15:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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