Clojure循环索引问题:如何让序列从0开始而非1?
解决Clojure遍历列表时索引从0开始的问题
问题分析
你当前代码输出索引从1开始,是因为在for推导式里用了(inc i),把range生成的0起始序列递增了1。而你尝试的for [i 0 (range (count lst))]不符合Clojure的for语法,所以报错。
解决方案
方案1:直接修正原有代码
去掉inc函数,直接使用range生成的0起始序列:
(fn [lst] (doseq [i (range (count lst))] (println i)))
(range (count lst))会生成0, 1, 2, ..., (count lst)-1的整数序列,正好是从0开始的索引。
方案2:更地道的元素+索引遍历(推荐)
如果需要同时获取列表元素和对应索引,使用map-indexed会更符合Clojure的惯用写法,也更安全(比如处理惰性序列时避免提前遍历整个序列):
(fn [lst] (doseq [[idx elem] (map-indexed vector lst)] (println idx) ; 如果需要使用元素,可以在这里操作elem ))
map-indexed会把每个元素和它的索引组成向量,通过解构[idx elem]就能同时拿到两者。
错误原因说明
Clojure的for推导式语法是[symbol collection],即把符号绑定到集合的每个元素上,而非传统Java式的for(初始化; 条件; 步长)结构。你写的for [i 0 (range (count lst))]不符合这个语法规范,因此会抛出错误。
内容的提问来源于stack exchange,提问作者Chainsaw
相关产品推荐
相关产品推荐

