Python如何在列表停止增长后自动跳出while无限循环
需求可行性结论
这个需求完全可以实现。你遇到的无限循环本质是没有设置「列表停止增长」的判断出口,只要在每次循环迭代后校验列表是否有新增元素,无新增时直接终止循环即可。
实现原理
你的代码中列表始终会做去重处理(list(set(a))),列表停止增长的核心特征是:本轮迭代完成后的列表元素,和上一轮迭代完成后的列表元素完全一致,没有新增内容。
只需要在循环中记录上一轮迭代的列表状态,每轮更新完列表后做一次等值对比,匹配到无变化的状态就跳出循环。
具体修改步骤
- 进入
while循环前初始化一个变量,用来存储上一轮迭代的列表状态,为了对比高效且不受顺序影响,建议转成集合类型存储,避免列表可变引用导致的对比错误。 - 每一轮完整遍历所有元素、完成列表去重更新后,将当前列表转成集合,和上一轮存储的状态做对比。
- 如果两次状态完全相等,说明列表已经停止增长,直接用
break终止while循环即可。 - 额外修正原代码冗余问题:删除未使用的冗余变量,给
search函数增加返回值,避免最终打印得到None。
修正后的完整代码
import json terms = {'4837759863453450996': '"mamma riyoken"','4833480984509580996': '"mamma heika"','483775980980996': '"nemo heika"','4867568843796': '"control nemo"','4956775843796': '"t control"','483775843796': '"jared trav"','483843796': '"azu jared"', '483843996': '"hello azu"', '44384376': '"bitten virgo"', '48384326': '"bitten hello"', '61063868': '"charm feline voxela derp virgo"', '11136664': '"jessica"', '11485423': '"yukkixxtsuki"', '10401438': '"howen"', '29176667': '"zaku ramba char"', '36976082': '"bulma zelda dame prince"', '99661300': '"voxela"', '76923817': '"juniperrose"', '16179876': '"gnollfighter"', '45012369': '"pianist fuzz t travis blumt trav ttttttttttttttttttyt whole ryann lol tiper cuz"', '62797501': '"asriel"', '73647929': '"voxela"', '95019796': '"dao daoisms"', '70094978': '"mort"', '16233382': '"purrs"', '89270209': '"apocalevie waify"', '42873540': '"tear slash peaches attitude maso lyra juvia innocent"', '61284894': '"pup"', '68487075': '"ninja"', '66451758': '"az"', '23492247': '"vegeta"', '77980169': '"virus"'} def _search(string): a = [] for i in terms: term_content = json.loads(terms[i]) term_words = term_content.split() if string in term_words: a += term_words for i in terms: term_content = json.loads(terms[i]) term_words = term_content.split() if set(term_words) & set(a): a += term_words return list(set(a)) def search(string): ret = _search(string) a = [] for i in ret: a += _search(i) a = list(set(a)) # 初始化上一轮状态为空集合 prev_set = set() while True: # 遍历更新当前列表 for n in a: a += _search(n) a = list(set(a)) print(a) # 对比当前集合和上一轮集合 current_set = set(a) if current_set == prev_set: # 无新增元素,终止循环 break # 更新上一轮状态为当前状态,进入下一轮迭代 prev_set = current_set # 返回最终结果 return a print(search("charm"))
注:原代码中字典值里的
"是HTML转义的双引号字符,直接运行会导致json解析报错,修正代码中已经替换为标准双引号,可直接运行。
内容的提问来源于stack exchange,提问作者Herenti
相关产品推荐
相关产品推荐

