推动:我 在python中寻找能让我的东西
f([1,2,3]) == [[1,2,3], [2,3], [3]]
在clojure中,这只是(nest rest #(not (empty? %)) lst)
,或者如果我们有巢功能的话。我们要不要?我厌倦了盯着clojure api列表..
更好的方法在python或clojure也将受到赞赏..
答案 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))
答案 2 :(得分:1)
也许是这样的事情(我想到的第一件事,我最近没有做过clojure,所以它可能不是最好的解决方案):
(take-while identity (iterate next [1 2 3]))
更新
Justin建议的这个解决方案更可取(更短,[]
输入等):
(take-while seq (iterate 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
可能会更快。
另请注意,列表不是最佳数据结构。