python / clojure等同于mathematica的NestWhileList

时间:2011-03-13 23:14:22

标签: python clojure wolfram-mathematica

推动:我 在python中寻找能让我的东西

f([1,2,3]) == [[1,2,3], [2,3], [3]]

在clojure中,这只是(nest rest #(not (empty? %)) lst),或者如果我们有巢功能的话。我们要不要?我厌倦了盯着clojure api列表..

更好的方法在python或clojure也将受到赞赏..

6 个答案:

答案 0 :(得分:3)

data = [1,2,3]
result = [ data[i:] for i in range(len(data)) ]

答案 1 :(得分:3)

返回seqs:

user> (take-while seq (iterate rest [1 2 3]))
([1 2 3] (2 3) (3))

返回向量:

user> (take-while seq (iterate #(subvec % 1) [1 2 3]))
([1 2 3] [2 3] [3])

我已经看到这个模式打包成iterate-while函数,这与您的nest函数几乎相同:

(defn iterate-while [pred f x]
  (take-while pred (iterate f x)))

请注意,(seq x)(not (empty? x))

等同,并且优先于{{1}}

答案 2 :(得分:1)

也许是这样的事情(我想到的第一件事,我最近没有做过clojure,所以它可能不是最好的解决方案):

(take-while identity (iterate next [1 2 3]))

更新

Justin建议的这个解决方案更可取(更短,[]输入等):

(take-whil­e seq (iter­ate rest ...))

答案 3 :(得分:1)

user> (reductions conj [] [1 2 3])
([] [1] [1 2] [1 2 3])

获取空版本。如果你愿意,你可以改为

user> (take-while identity (iterate next [1 2 3]))
([1 2 3] (2 3) (3))

user> (rest (reductions conj [] [1 2 3]))
([1] [1 2] [1 2 3])

答案 4 :(得分:1)

(partition-all 3 1 [1 2 3])

产量

((1 2 3) (2 3) (3))

如果你想要它的矢量格式

(vec (map vec (partition-all 3 1 [1 2 3])))

P.S。分区中的3和1 - 在[1 2 3]之前都定义了矢量应该以3的为一组进行分区,步长为1,并且不是输入向量的一部分。我使用partition-all而不是partition,因为partition-all不介意组的长度小于指定的3的长度。

答案 5 :(得分:0)

的Python:

def f(l):
    while l:
        yield l[:]
        l.pop(0)

副本([:])取决于您是否需要列表的副本,或者您可以在适当的位置进行修改。如果您一次只需要一个子列表,则删除副本并迭代f可能会更快。

另请注意,列表不是最佳数据结构。