【问题标题】:merging a series of vectors into one sequentially in clojure在clojure中将一系列向量顺序合并为一个
【发布时间】:2016-11-09 20:52:37
【问题描述】:

我有一个程序可以搜索亚马逊并返回指定书籍的信息。执行完所有搜索后,我希望能够按 SalesRank 对书籍进行排序。我遇到的问题是能够将向量组合成一个大集合。现在我可以让它们一个一个地打印,但每次迭代都会覆盖前一个。我是一个函数式编程 NOOB,所以任何帮助表示赞赏。下面是一个sn-p:

(defn get_title_and_rank_for_one_isbn [isbn]

        (def book_title (get-in (amazon_search isbn)[:items 0 :item-atributes :title]))
        (def sales_rank(get-in (amazon_search isbn)[:items 0 :SalesRank]))
        (def book_isbn(get-in (amazon_search isbn)[:items 0 :asin]))

)

(defn get_title_and_rank_for_all_isbns [list_of_isbns]
    (doseq [isbn list_of_isbns] 
        (Thread/sleep 3000)
        (get_title_and_rank_for_one_isbn isbn)
        (def combine_attributes(reduce into [[book_title] [book_isbn] [sales_rank]]))
        (println combine_attributes)
    )

)

【问题讨论】:

  • 这显然与您几个小时前发布的问题相同。您不会在 SO 上以新帐户名重新发布。请在为您关闭之前删除此问题。有人会在适当的时候帮助你。与此同时,继续自己解决问题。也许买一本书。
  • @jmargolisvt 我没有任何其他帐户。你能把我链接到另一个帖子吗?也许是同学。
  • 这是clojure标签上的上一个问题:stackoverflow.com/questions/40513290/…。如果在接下来的几个小时内没有其他人回答,我今晚会在另一个问题上发布一些内容,让你们继续前进。与此同时……这是一堂课?拿出教科书! :)
  • 好像其他人删除了他的帖子。

标签: vector clojure functional-programming


【解决方案1】:
(defn- get-books [data]
  (letfn [(one-book [book]
            (let [title (get-in book :title)
                  rank (get-in book :rank)
                  isbn (get-in book :isbn)]
                {:title title
                 :rank rank
                 :isbn isbn}))]
            (map one-book data))))

可能有几种方法可以做到这一点,但这是一些简化代码的方法。你可以这样调用函数:(println (get-books data))data 是你的 json 结构。

那么get-books 发生了什么? leftn 允许您定义可以在此处封装的函数。 Clojure 函数将返回最后定义的东西,在这种情况下,它是 map 函数。事实上,它几乎是这里唯一“运行”的东西。它将您的数据映射到one-book 函数上,该函数使用let 创建绑定,当每本书通过该函数时重新绑定。这代替了您使用def 的想法。

同样,one-book 返回其最后一个定义,即键值结构。您映射所有数据,然后将其打印出来,将其传递给另一个函数,或者您需要对其执行的任何操作。

这不是一个精确的解决方案,而是关于如何考虑处理数据以及如何从函数返回值的建议。

【讨论】:

  • 哇!这是一个很棒的模板,让我更好地了解如何在 Clojure 中执行任务。非常感谢您抽出宝贵时间给出如此详细的答案。
  • 当然可以。一个适当的所以谢谢你会接受答案。
【解决方案2】:

首先观察(amazon_search isbn) 每个 isbn 应该只运行一次。

然后map 独立检查每个搜索结果,并将所需数据提取到您最终按销售排名排序的新地图中。

 (defn get-book [isbn]
   (let [itm (get-in (amazon_search isbn) [:items 0])]
     {:book/title (get-in itm [:item-attributes :title])
      :book/sales-rank (:SalesRank itm)
      :book/isbn (:asim itm)}))

 (defn get-books-sorted-by-sales-rank [isbns]
    (->> isbns (map get-book) (sort-by :book/sales-rank)))

 ;; a bit more performant 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2017-10-25
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多