如何使用zip、length和列表生成式实现查找字符串中指定字符所有出现位置的功能
实现方案
直接给出符合要求的代码如下:
search :: String -> Char -> [Int] search str target = [idx | (idx, char) <- zip [0..] str, char == target]
逻辑说明
- 这里利用了
zip函数的特性:当两个输入列表长度不一致时,会在较短的列表遍历完成后自动终止,所以直接用无限列表[0..]和输入字符串做合并,就能得到「索引-对应字符」的二元组列表,不需要手动计算字符串长度来生成索引区间。如果你需要显式结合length和[m..n]语法实现,等价写法为:search str target = [idx | (idx, char) <- zip [0 .. length str - 1] str, char == target] - 列表推导式中你只需要在结果部分输出二元组的第一个元素(也就是索引),完全不需要保留字符相关的内容,符合你说的「省略字符串相关部分」的思路。
- 不需要开启并行列表推导扩展,普通列表推导配合
zip就能实现需求,兼容性更强。
效果验证
你给出的测试用例可以完全匹配:
search "Bookshop" 'o'输出[1,2,6]search "senselessness" 's'输出[0,3,7,8,11,12]
内容的提问来源于stack exchange,提问作者idontknowhowtocode
相关产品推荐
相关产品推荐

