获取包含当前元素对的列表以及包含所有其他元素的列表的最快方法是什么? 这应该很快,因为列表可能包含一百万或更多元素。

例如给出列表(1 2 3)

我想得到清单((1 (2 3)) (2 (1 3)) (3 (1 2)))

谢谢你的帮助!

===============>>#1 票数:6 已采纳

这将无需遍历遍历整个向量:

(defn this-and-that [xs]
  (map-indexed (fn [i x]
                [x (concat (take i xs) 
                           (drop (inc i) xs))])
              xs))

并且也适用于nils:

user=> (this-and-that [1 2 nil 3])
([1 (2 nil 3)] [2 (1 nil 3)] [nil (1 2 3)] [3 (1 2 nil)])

===============>>#2 票数:4

“百万元素”并不是很多。 试试这是否足够快:

(defn this-and-that
  [s]
  (map-indexed (fn [i el]
                 [el (keep-indexed #(if (= %1 i)
                                            nil
                                            %2) s)]) s))

例:

user> (this-and-that [1 2 3])
([1 (2 3)] [2 (1 3)] [3 (1 2)])

请注意,对于包含nil seq,此代码无法正常工作。

===============>>#3 票数:4

其他答案提供了很好的方法,但是你所描述的基本上是一个O(n ^ 2)操作,假设你实际上已经实现了所有的懒惰序列等。如果n> =这可能不是一个好主意。百万

您可能需要考虑扩大您正在考虑的代码范围,看看您是否可以找到更有效的算法。

例如,您可能会发现最好将整个列表转换为向量,并根据对向量的索引访问来编写算法。

===============>>#4 票数:1

使用套装怎么样?

user> (let [xs #{1 2 3}]
        (for [x xs] [x (disj xs x)]))
([1 #{2 3}] [2 #{1 3}] [3 #{1 2}])

在具有一百万个项目的集合上执行此操作时间并不太糟糕:

(let [xs (set (range 1000000))]
  (time (count (for [x xs] [x (disj xs x)]))))
"Elapsed time: 841.668 msecs"
1000000

  ask by toofarsideways translate from so

未解决问题?本站智能推荐:

2回复

“for”在clojure中实际上是不是很懒惰?

我以为我只是非常密集。 但不是,事实证明Clojure实际上评估了任何延迟序列的前32个元素(如果可用)。 哎哟。 我有一个for的递归调用:let 。 我很好奇为什么计算似乎是先进行广泛而不是深度优先。 似乎计算(尽管,公平,不是内存)正在爆炸,因为我一直在递归树的所有上部分支
2回复

在Clojure程序中跟踪StackOverflow,其中包含SSCCE

我很难追踪由我的Bron-Kerbosch算法的 clojure实现产生的stackoverflow错误。 以下是我对算法本身的实现,下面是指向SSCCE的链接,概述了问题http://pastebin.com/gtpTT4B4 。 由于函数算法是递归的,因此我不得不假设问题显然在
3回复

Clojure列表理解和试剂的唯一值

假设我们有一个网格,其值可以为0或1: 现在,我想使用列表理解将grid转换为类似HTML的打ic格式: 该表是正确生成的,但是我不知道如何为我的td创建unique index 。 我how-i-can-generate-a-index? 应该?
1回复

Clojure:将字符串与列表推导一起使用

我正在尝试编写马丁·奥德斯基(Martin Odersky)的功能编程课程的第6.7讲的Clojure版本。原文是用Scala编写的。 这个概念是采用电话号码(作为字符串)并给出给定单词词典的可能短语列表。 因此, translate("7225247386")会产生短语“ Scal
2回复

如何在Clojure中进行列表理解?

我正在学习Clojure,我找到了解决方案,使用列表理解在Haskell书中找到正确的三角形问题,使问题得到彻底解决: 找到正确的三角形 三边的长度都是整数。 每边的长度小于或等于10。 三角形的周长(边长的总和)等于24。 在Haskell: ghci
2回复

Clojure序列理解中是否存在变量?

我正在阅读Programming Clojure第2版,在第49页上它涵盖了Clojure的for循环结构,它说它实际上是一个序列理解。 作者建议使用以下代码: ...优于基于Java的命令式示例,并且给出的证据是“通过使用高阶函数......任何函数索引都避免了对变量的所有需求”
3回复

`for`如何在这个递归的Clojure代码中工作?

Clojure初学者在这里。 这里有一些我想要了解的代码,来自http://iloveponies.github.io/120-hour-epic-sax-marathon/sudoku.html (一个相当不错的开头Clojure课程的一页): 当然, (subset-sum #
3回复

是否有python函数返回添加了新键的新字典,例如clojure中的assoc?

在写了一段时间的clojure之后,我正在写python,虽然有点生疏,但是我正在以一种更加实用的风格来处理它。 要遵循我在clojure中使用的模式,我想使用map(或列表理解)和assoc之类的东西在列表中的每个字典中设置键。 我有一个记录列表,我想用列表推导来重构它们。 记录如下所示:
1回复

为什么列表的println表现得像列表理解?

为什么我的println(示例的最后一行)不像列表理解? 我正在尝试以下代码来获得Clojure中Project Euler的问题#2的解决方案: 我得到的输出如下: (def || [0 1] || [0 1]) (定义倒数第二[|| [0 1 1 2 3 5 8
6回复

什么是可以通过列表推导完成的事情的一个可靠的例子,这对于高阶函数来说是棘手的?

我从他们更喜欢列表理解许多Pythonists听说过,因为他们可以做的一切,你可以使用高阶功能,如过滤器和减少, 多做 。 所以这个问题解决了这些问题:你可以用它们做些什么的可靠例子,这对HOF来说很棘手?