Clojure:列表或其他集合中值的索引

log*_*olf 4 clojure

如何获取字符串列表中任何元素的索引:

(list "a" "b" "c")
Run Code Online (Sandbox Code Playgroud)

例如,(function "a")将不得不返回0,(function "b")1,(function "c")2,依此类推.

并且...如果处理很长的数据列表,使用任何其他类型的集合会更好吗?

Chr*_*erg 7

我不确定我理解你的问题.你想要列表中每个字符串的第n个字母吗?这可以这样完成:

(map #(nth % 1) (list "abc" "def" "ghi"))
Run Code Online (Sandbox Code Playgroud)

结果是:

(\b \e \h)
Run Code Online (Sandbox Code Playgroud)

更新

在阅读您对我的初始答案的评论后,我假设您的问题是"如何在列表中找到搜索字符串的索引(位置)?"

一种可能性是从列表的开头搜索字符串并计算您必须跳过的所有条目:

(defn index-of [item coll]
  (count (take-while (partial not= item) coll)))
Run Code Online (Sandbox Code Playgroud)

示例:(index-of "b" (list "a" "b" "c"))return 1.

如果你需要进行大量的查找,那么构造hash-map所有字符串及其索引可能更有效:

(def my-list (list "a" "b" "c"))
(def index-map (zipmap my-list (range)))
(index-map "b") ;; returns 1
Run Code Online (Sandbox Code Playgroud)

注意,使用上面的定义,当列表中有重复条目时index-of将返回第一个索引,而index-map将返回最后一个.


Mic*_*ent 7

Christian Berg的答案很好.也可以回到Java的indexOf类方法String:

(.indexOf (appl­y str (list­ "a" "b" "c"))­ "c")
Run Code Online (Sandbox Code Playgroud)

; => 2

当然,这只适用于字符串(长度为1)或字符的列表(或更一般的,seqs).

更通用的方法是:

(defn index-of [e coll] (first (keep-indexed #(if (= e %2) %1) coll)))
Run Code Online (Sandbox Code Playgroud)

更惯用的是懒洋洋地返回所有索引,只询问你需要的索引:

(defn indexes-of [e coll] (keep-indexed #(if (= e %2) %1) coll)) 

(first (indexes-of "a" (list "a" "a" "b"))) ;; => 0
Run Code Online (Sandbox Code Playgroud)