Python按规则从字符列表有序提取目标序列元素的实现方案咨询
Hey there! 作为一个同样痴迷Python的学习者,我完全懂你设计这个练习时碰到的卡点——严格按顺序提取字符可比单纯统计数量要烧脑多啦!咱们一步步来解决这个问题~
问题回顾
先把需求和规则再理清楚:
我们有原字符列表:
some_list = ['a','l','p','p','l','l','i','i','r','i','r','a','a']
需要从中提取两个完整的目标序列april,结果可以是['aprilapril']或者['a','p','r','i','l','a','p','r','i','l'],且必须遵守:
- 字符
a、p、r、i、l只能从原列表提取,不能凭空生成 - 提取必须严格遵循
a→p→r→i→l的链式顺序,顺序错了不算数 - 不能用直接统计字符数量生成结果、正则匹配、
collections.Counter统计这三种方法
符合规则的解决方案
下面这个方法完全贴合你的要求,模拟了我们手动按顺序找字符的过程:
some_list = ['a','l','p','p','l','l','i','i','r','i','r','a','a'] target = ['a', 'p', 'r', 'i', 'l'] result = [] target_pos = 0 # 标记当前需要找的目标字符位置 finished_sequences = 0 # 记录已经完成的完整april序列数 for char in some_list: # 如果当前字符正好是目标序列里现在需要的,就提取它 if char == target[target_pos]: result.append(char) target_pos += 1 # 走完一轮april,完成一个序列 if target_pos == len(target): finished_sequences += 1 target_pos = 0 # 重置位置,开始找下一个序列 # 已经凑够2个,提前结束循环(可选,省点性能) if finished_sequences == 2: break # 两种输出形式二选一,或者都保留 # 合并成字符串的结果 merged_result = [''.join(result)] print("合并为字符串的结果:", merged_result) # 保留列表形式的结果 print("列表形式的结果:", result)
代码小解释
- 初始化变量:
target存我们要找的顺序,target_pos标记当前需要抓目标序列里的第几个字符,finished_sequences记已经成功提取的完整序列数。 - 遍历原列表:逐个检查每个字符:
- 要是当前字符和目标序列
target_pos位置的字符对上,就把它加入结果,同时target_pos往后挪一位,找下一个目标字符。 - 当
target_pos等于目标序列长度时,说明凑齐了一个april,把完成数加1,重置位置开始找下一个。 - 完成数到2的时候,直接跳出循环就行,不用再看剩下的字符啦。
- 要是当前字符和目标序列
- 输出结果:可以把结果合并成字符串(得到
['aprilapril']),也可以保留原列表形式(得到['a','p','r','i','l','a','p','r','i','l']),完全看你需求。
运行这段代码,你就能得到符合规则的结果啦——所有字符都是从原列表按顺序薅出来的,绝对没作弊!
内容的提问来源于stack exchange,提问作者Tian
相关产品推荐
相关产品推荐

