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
确实是任何日期的替代,那么(按提取日期列表分组)
首先会更好