【问题标题】:Convert a lazy sequence of maps into a single map将惰性映射序列转换为单个映射
【发布时间】:2019-11-10 00:31:35
【问题描述】:

我是 Clojure 菜鸟。我正在尝试采用惰性地图序列并将其转换为单个地图。映射键是整数,值是向量。 我见过很多合并地图的例子,例如

(merge map1 map2) ;;or
(into {} [{a: 1} {b: 2} {c: 3}])

但是当它是一个惰性序列时,我仍然遇到困难。当我使用:

(into {} mapSeq) 

它只返回序列中的最后一张地图。

(defn combine-maps [mapSeq]
  (pp/pprint (into {} mapSeq))))

(defn file-input-to-vec [file] 
  (let [page (line-seq (clojure.java.io/reader file))
        page-number (vec (mapv #(str/split %1 #" ") page))] 

    (combine-maps (for [i page-number]  
                { :pageID (edn/read-string (first i)) 
                  :outpages (convert-to-int-vec (drop 1 i)) }))))

我只得到最后一页:

{:pageID 6, :outpages [9770 0 8758 6103 9560 356 8469 3570 1178]}

我想要这个:

{:pageID 0, :outpages [6 5 2 4 1 3], 
 :pageID 1, :outpages [0 461 4772 1324 1735 487 5668],
 :pageID 2, :outpages [4412 0 209 3130 6902 8397 4373 905 3833],
 :pageID 3, :outpages [5103 1203 7063 0 5866 445 5498 6217 6498], 
 ... }

【问题讨论】:

    标签: clojure


    【解决方案1】:

    你说你想要的返回值不是合法的映射,因为它有多次出现的键:pageID和多次出现的键:outpages。 Clojure 映射(以及它们在大多数编程语言中的对应事物,例如 Python 中的字典)每个键最多出现一次。

    如果您将所需的返回值更新为有效的 Clojure 数据结构,那么有人可以帮助编写代码。

    【讨论】:

    • 我想我对语法感到困惑。出于某种原因,我认为“:pageID”表示“1”是关键,但如果我简单地删除“:pageID”和“:outpages”,我认为可以解决我的问题。
    • 否,:pageId 是 key,1 是 value,与 :outPages 相同。当您删除它们时它会起作用,因为列表中没有重复,最初在插入第二个映射时,它会插入一个值为 2 的键 :pageId 并发现它已经存在值为 1 并覆盖/替换它,与其他相同值 3 和 outpages。希望这会有所帮助。
    【解决方案2】:

    如果您还没有解决方案,我想推荐一些东西。首先,我也是一个 clojure 的菜鸟,但我认为您的解决方案不会起作用,因为 :pageId 和 :outpages 多次出现,如docs 所示。

    如果assoc中使用的key已经存在,则替换该值

    我会推荐它而不是

    
    (into {} [{:pageID 1 :outpages 2} 
           {:pageID 2 :outpages 3} 
          {:pageID 3 :outpages 4}])
    

    您将它们连接到地图向量中

    
    (conj [] {:pageID 1 :outpages 2} 
           {:pageID 2 :outpages 3} 
          {:pageID 3 :outpages 4})
    

    它会执行您需要的任何操作,例如在 :pageId 索引处获取 :outpages

    
    (nth [{:pageID 1, :outpages 2} {:pageID 2, :outpages 3} {:pageID 3, :outpages 4}] (- index 1))
    

    【讨论】:

    • 也感谢您。不是我最终使用的,但我以后可能会发现它很有用。
    【解决方案3】:

    解决方案是删除 :pageID 和 :outpages,因为它们分别是键和值。感谢您的意见。

    【讨论】:

      【解决方案4】:

      如果你有一个包含整数的向量列表,像这样

      (def [[6 5 2 4 1 3], 
      [0 461 4772 1324 1735 487 5668],
      [4412 0 209 3130 6902 8397 4373 905 3833],
      [5103 1203 7063 0 5866 445 5498 6217 6498]]
      

      然后您可以像这样将页码映射到您的向量:

      user> (into {} (map-indexed (fn [i page] [i page]) pages))
      {0 [6 5 2 4 1 3],
       1 [0 461 4772 1324 1735 487 5668],
       2 [4412 0 209 3130 6902 8397 4373 905 3833],
       3 [5103 1203 7063 0 5866 445 5498 6217 6498]}
      

      into 知道如何从包含两项的向量列表中制作地图。

      【讨论】:

        猜你喜欢
        • 2011-10-25
        • 2012-06-16
        • 2022-10-02
        • 1970-01-01
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多