Python / Clojure эквивалентный NestWhileList Mathematica - PullRequest
3 голосов
/ 14 марта 2011

Импульс: я искал что-то в python, что могло бы заставить меня

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

В clojure это будет просто (nest rest #(not (empty? %)) lst), или если бы у нас была функция гнезда. Мы? Я устал смотреть на список api clojure ..

Также приветствуются лучшие подходы в python или clojure ..

Ответы [ 6 ]

3 голосов
/ 14 марта 2011

Return 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))

3 голосов
/ 14 марта 2011
data = [1,2,3]
result = [ data[i:] for i in range(len(data)) ]
1 голос
/ 14 марта 2011
(partition-all 3 1 [1 2 3])

дает

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

, если вы хотите его в векторном формате

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

ps 3 и 1 в разбиении на все до [1 2 3] определить, что вектор должен быть разбит на группы по 3 с шагом 1 и не являются частью входного вектора.Я использую разделение-все вместо раздела, потому что раздел-все не заботится о том, чтобы группы были короче указанной длины 3.

1 голос
/ 14 марта 2011
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])
1 голос
/ 14 марта 2011

Может быть, что-то вроде этого (первое, что пришло мне в голову, и я недавно не делал clojure, так что это может быть не лучшим решением):

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

Обновление:

Это решение, предложенное Джастином, является предпочтительным (короче, [] ввод и т. Д.):

(take-whil­e seq (iter­ate rest ...))
0 голосов
/ 14 марта 2011

Python:

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

Копия ([:]) зависит от того, хотите ли вы копию списка или вы согласны с ее изменением на месте. Если вам нужен только один из подсписков за раз, может быть быстрее удалить копию и выполнить итерации по f.

Обратите внимание, что список не является лучшей структурой данных для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...