Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 基于一个值将数组拆分为多个数组_Clojure - Fatal编程技术网

Clojure 基于一个值将数组拆分为多个数组

Clojure 基于一个值将数组拆分为多个数组,clojure,Clojure,我需要在多个数组中分离一个对象数组,基于每个对象的精确值。即 [ {"15/02" :date}, {"16/02" :date}, {"15/02" :date}, ] 结果应该是: [ [ {"15/02" :date}, {"15/02" :date} ], [ {"16/02" :date} ] ] 看完你的评论后,我发现它不是重复的 您可以使用frequencies功

我需要在多个数组中分离一个对象数组,基于每个对象的精确值。即

[
  {"15/02" :date},
  {"16/02" :date},
  {"15/02" :date},
]
结果应该是:

  [
      [
        {"15/02" :date},
        {"15/02" :date}
      ],
      [
        {"16/02" :date}
      ]
  ]

看完你的评论后,我发现它不是重复的

您可以使用
frequencies
功能完成所有繁重的工作。请参阅:

以下是正在运行的代码:

(def data [
           {"15/02" :date},
           {"16/02" :date},
           {"15/02" :date},
          ])

(frequencies data) => { {"15/02" :date} 2, 
                        {"16/02" :date} 1}
因此,结果是Clojure映射,其中键是原始(唯一)值,VAL是每个值发生的计数

我们可以添加一些代码,将每个唯一值重复正确的次数,以获得最终结果:

(defn make-repeat-groups
  [freq-map]
  (vec
    (for [entry freq-map]
      (let [ [item reps] entry]
        (vec (repeat reps item))))))

(make-repeat-groups (frequencies data)) 
  =>  [ [{"15/02" :date} 
         {"15/02" :date}] 
        [{"16/02" :date}] ]

请注意,您实际上并不需要这两个
vec
函数,但我认为如果输出是一个向量而不是(惰性)列表,则更易于阅读。

阅读您的注释后,我发现它不是重复的

使用
frequencies
功能,您可以完成所有繁重的工作。请参阅:

以下是正在运行的代码:

(def data [
           {"15/02" :date},
           {"16/02" :date},
           {"15/02" :date},
          ])

(frequencies data) => { {"15/02" :date} 2, 
                        {"16/02" :date} 1}
因此,结果是Clojure映射,其中键是原始(唯一)值,VAL是每个值发生的计数

我们可以添加一些代码,将每个唯一值重复正确的次数,以获得最终结果:

(defn make-repeat-groups
  [freq-map]
  (vec
    (for [entry freq-map]
      (let [ [item reps] entry]
        (vec (repeat reps item))))))

(make-repeat-groups (frequencies data)) 
  =>  [ [{"15/02" :date} 
         {"15/02" :date}] 
        [{"16/02" :date}] ]

请注意,您并不真正需要这两个
vec
函数,但我认为如果输出是一个向量而不是(惰性)列表,则更易于阅读。

这将产生您想要的答案:

(mapv val (group-by ffirst dates))

(散列)映射是映射项的
序列?
。在这里,我们所关注的对象是第一个映射条目(始终只有一个),它在Clojure中表示为元组(2向量),例如
[“15/02”:date]
。从该对象开始,我们需要通过元组的第一个(映射项的键)元素进行分组。希望这能解释为什么
ffirst
可以获得需要作为
groupby

主题的字符串键,这将产生您想要的答案:

(mapv val (group-by ffirst dates))

(散列)映射是映射项的
序列?
。在这里,我们所关注的对象是第一个映射条目(始终只有一个),它在Clojure中表示为元组(2向量),例如
[“15/02”:date]
。从该对象开始,我们需要通过元组的第一个(映射项的键)元素进行分组。希望这能解释为什么
ffirst
可以获得字符串键,该键需要成为
groupby

注释的主题

数据看起来不正确

  • 向量中的每个贴图都有一个条目,可以是 我们要订一双
  • 如果这些是被删减的记录,那么键和值肯定是最重要的 方向不对,应该是
(def数据[{:date“15/02”}{:date“16/02”}{:date“15/02”}])

那么解决办法就是

(->> data (group-by :date) vals vec)
=> [[{:date "15/02"} {:date "15/02"}] [{:date "16/02"}]]

评论

数据看起来不正确

  • 向量中的每个贴图都有一个条目,可以是 我们要订一双
  • 如果这些是被删减的记录,那么键和值肯定是最重要的 方向不对,应该是
(def数据[{:date“15/02”}{:date“16/02”}{:date“15/02”}])

那么解决办法就是

(->> data (group-by :date) vals vec)
=> [[{:date "15/02"} {:date "15/02"}] [{:date "16/02"}]]

可能是重复的否,因为我需要两个对象都按向量放在里面,我不想合并,为什么你的贴图看起来有键和值交换?可能是重复的否,因为我需要两个对象都按向量放在里面,我不想合并,为什么你的贴图看起来有键和值交换?请注意,地图条目的
第一个
第二个
有效,但没有给出正确的意图。因此,我宁愿使用
val
,而不是
second
ffirst
还有更棘手的问题。因此,与其使用“内部”
first
键,不如使用“外部”
first
键,但由于数据的形状,“外部”
键只在这里起作用。如果该映射有更多的条目,则此操作将失败,因为映射仅在前几对中按顺序显示。例如
(map val(group by identity data))
就足够了。我一直认为
:date
实际上意味着一个实际日期,所以val不同,所以identity不是正确的选择。关于只有一个的观点——但我强调了这一点,并且(在本例中)正在处理给出的数据。因此,
(mapv val(分组依据(comp-key-first)日期))
将是另一种选择,但我将只更改
val
。是的,示例数据的形状很奇怪。或者它是键/值交换的,或者如果
:date
确实是任何日期的替身,那么
(按提取日期列表分组)
首先会更好。请注意,地图条目的
第一个
第二个
有效,但没有给出正确的意图。因此,我宁愿使用
val
,而不是
second
ffirst
还有更棘手的问题。因此,与其使用“内部”
first
键,不如使用“外部”
first
键,但由于数据的形状,“外部”
键只在这里起作用。如果该映射有更多的条目,则此操作将失败,因为映射仅在前几对中按顺序显示。例如
(map val(group by identity data))
就足够了。我一直认为
:date
实际上意味着一个实际日期,所以val不同,所以identity不是正确的选择。关于只有一个的观点——但我强调了这一点,并且(在本例中)正在处理给出的数据。因此,
(mapv val(分组依据(comp-key-first)日期))
将是另一种选择,但我将只更改
val
。是的,示例数据的形状很奇怪。要么是键/值交换,要么如果
:date
确实是任何日期的替代,那么
(按提取日期列表分组)
首先会更好