Преобразуйте ленивую последовательность карт в одну карту - PullRequest
0 голосов
/ 10 ноября 2019

Я 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]}

I 'мне нравится это:

{: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], 
 ... }

Ответы [ 4 ]

4 голосов
/ 10 ноября 2019

Возвращаемое значение, которое, как вы говорите, вам нужно, не является допустимой картой, поскольку в нем есть несколько вхождений ключа :pageID и несколько вхождений ключа :outpages. Карты Clojure (и соответствующие им элементы в большинстве языков программирования, например, словари в Python) имеют не более одного вхождения каждого ключа.

Если вы обновляете то, что хотите, в качестве возвращаемого значения для чего-то, что является действительными данными Clojureструктура, кто-то может помочь с кодом.

0 голосов
/ 12 ноября 2019

Если у вас есть список векторов, содержащих целые числа, например

(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 знает, как сделать карту из списка двухэлементных векторов.

0 голосов
/ 11 ноября 2019

Решение состоит в том, чтобы удалить: pageID и: outpages, поскольку они являются ключами и значениями соответственно. Спасибо за ввод.

0 голосов
/ 10 ноября 2019

если у вас нет решения, я бы порекомендовал что-нибудь. Прежде всего, я новичок, чтобы закрывать, но я думаю, что ваше решение не будет работать из-за множественных случаев: pageId и: outpages, как видно здесь docs .

ЕслиИспользуемый в Assoc ключ уже существует, значение заменено

Я бы рекомендовал вместо


(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})

Он будет честно выполнять любую нужную вам операцию, например, чтобы получить: outpages at: pageId index


(nth [{:pageID 1, :outpages 2} {:pageID 2, :outpages 3} {:pageID 3, :outpages 4}] (- index 1))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...