Clojure seq到vec转换-键必须为整数
我想得到向量eg中nil元素的指数。 [1 nil 3 nil 4 nil]=>[1 3 4 7]Clojure seq到vec转换-键必须为整数,clojure,Clojure,我想得到向量eg中nil元素的指数。 [1 nil 3 nil 4 nil]=>[1 3 4 7] (定义零索引[vec] (vec(删除零)(映射) #(如果(=(第二%)无(第一%) (所有2个分区(交错(范围(计数向量))向量‘‘‘‘‘‘) ) 运行此代码会导致 java.lang.IllegalArgumentException:键必须是整数 (无源文件:0) 如果我忽略了围绕所有内容的(vec)调用,它似乎可以工作,但返回的是序列而不是向量 谢谢大家! 试试这个: (定义零索引[v]
(定义零索引[vec]
(vec(删除零)(映射)
#(如果(=(第二%)无(第一%)
(所有2个分区(交错(范围(计数向量))向量‘‘‘‘‘‘)
)
运行此代码会导致
java.lang.IllegalArgumentException:键必须是整数
(无源文件:0)
如果我忽略了围绕所有内容的(vec)调用,它似乎可以工作,但返回的是序列而不是向量
谢谢大家! 试试这个:
(定义零索引[v]
(vec(删除零)(映射)
#(如果(=(第二%)无(第一%)
(所有2个分区(交错(范围(计数v))v()()())))
Clojure是一个LISP-1:它对函数和数据都有一个名称空间,因此当您调用(vec…
)时,您试图将结果序列作为参数传递给数据,而不是传递给标准库vec函数。请尝试以下操作:
(定义零索引[v]
(vec(删除零)(映射)
#(如果(=(第二%)无(第一%)
(所有2个分区(交错(范围(计数v))v()()())))
Clojure是一个LISP-1:它对函数和数据都有一个名称空间,因此当您调用
(vec…
)时,您试图将结果序列作为参数传递给数据,而不是传递给标准库vec函数。请参阅问题的其他答案(您正在跟踪vec
),但是考虑使用更简单的方法。
map
可以接受多个参数,在这种情况下,它们作为附加参数传递给map函数,例如(map f c1 c2…
调用(f(first c1)(first c2)…)
等,直到其中一个序列参数用尽
这意味着您的(分区全部2(交错…)
是一种非常详细的说法(映射列表(范围)v)
。还有一个函数映射索引
,它做同样的事情。但是,它只接受一个序列参数,因此(映射索引为f c1 c2)
是不合法的
以下是使用映射索引
、线程和nil?
为清晰起见重写的函数:
(定义零索引[v]
;注:地图fn称为like(f范围项目v-项目)
;与代码中的(f(范围项v-item))不同。
(>>(映射索引的#)(当(nil?%2)%1)v);像(映射#)(当…(范围)v)
(删除零?)
vec)
但是,您可以使用reduce和reduce kv
功能来代替。此函数类似于reduce
,只是reduce函数接收三个参数,而不是两个:累加器、集合中项的键(向量索引、映射键)和项本身。使用reduce kv
可以更清楚地重写此函数(并且它可能会运行得更快,尤其是在瞬态情况下):
(定义零索引[v]
(减少千伏#(如果(零?%3)(联合%1%2)%1)[v))
<>代码> 查看您的问题的其他答案(您正在跟踪<代码> VEC<代码>),但请考虑使用更简单的方法。
map
可以接受多个参数,在这种情况下,它们作为附加参数传递给map函数,例如(map f c1 c2…
调用(f(first c1)(first c2)…)
等,直到其中一个序列参数用尽
这意味着您的(分区全部2(交错…)
是一种非常详细的说法(映射列表(范围)v)
。还有一个函数映射索引
,它做同样的事情。但是,它只接受一个序列参数,因此(映射索引为f c1 c2)
是不合法的
以下是使用映射索引
、线程和nil?
为清晰起见重写的函数:
(定义零索引[v]
;注:地图fn称为like(f范围项目v-项目)
;与代码中的(f(范围项v-item))不同。
(>>(映射索引的#)(当(nil?%2)%1)v);像(映射#)(当…(范围)v)
(删除零?)
vec)
但是,您可以使用reduce和reduce kv
功能来代替。此函数类似于reduce
,只是reduce函数接收三个参数,而不是两个:累加器、集合中项的键(向量索引、映射键)和项本身。使用reduce kv
可以更清楚地重写此函数(并且它可能会运行得更快,尤其是在瞬态情况下):
(定义零索引[v]
(减少千伏#(如果(零?%3)(联合%1%2)%1)[v))
该死,我怎么会错过这个:我以为你来自LISP-2的背景;这是一个相当有争议的分歧该死,我怎么会错过这个:我以为你来自LISP-2的背景;这是一个相当有争议的分歧在第一个示例中,您可以使用映射索引
来省略(范围)
:(映射索引#)(当(nil?%2)%1)v)
一些建议:1。如果函数值得定义,则将筛选谓词-herenil?
-作为参数。2.在第一个解决方案中,将最后一个vec
留给调用者,为潜在的大、甚至无限的序列参数保留惰性。3.在->
主题下,索引的地图可能更整洁。因此:(defn index filter[pred coll](>>coll(map indexed#)(when(pred%2)%1))(remove nil?)
例如,(index filter nil?[nil 1 2 nil 4 nil nil])=>(0 3 5 6)
您可以在第一个示例中使用map indexed
来省略(范围)
:(map indexed#(when(nil?%2)%1)v)
一些建议:1。如果函数值得定义,则将筛选谓词-herenil?
-作为参数。2.在第一个解决方案中,将最后的vec
留给调用者,为潜在的用户保留惰性