【问题标题】:Group(Partition) lazy sequence by key按键分组(分区)惰性序列
【发布时间】:2014-03-14 02:32:57
【问题描述】:

我有一个懒惰的地图序列:

{:a 1 :b "a"} {:a 1 :b "b"} {:a 2 :b "a"} {:a 3 :b "a"} {:a 3 :b "b"} ...

我想通过 key 对其进行分组 :a 并返回另一个惰性序列:

[{:a 1 :b "a"} {:a 1 :b "b"}] [{:a 2 :b "a"}] [{:a 3 :b "a"} {:a 3 :b "b"}] ...

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: clojure


    【解决方案1】:
    user=> (def a [{:a 1 :b "a"} {:a 1 :b "b"} {:a 2 :b "a"} {:a 3 :b "a"} {:a 3 :b "b"}])
    #'user/a
    user=> (group-by :a a)
    {1 [{:a 1, :b "a"} {:a 1, :b "b"}], 2 [{:a 2, :b "a"}], 3 [{:a 3, :b "a"} {:a 3, :b "b"}]}
    user=> (map second (group-by :a a))
    ([{:a 1, :b "a"} {:a 1, :b "b"}] [{:a 2, :b "a"}] [{:a 3, :b "a"} {:a 3, :b "b"}])
    

    【讨论】:

    • @you, op:请注意,懒惰在这里没有多大用处。分组步骤需要完整遍历输入序列,无论您要消耗的结果序列的元素有多少。我更喜欢在group-by 结果上调用vals 而不是map second。进一步注意,结果是未排序的。如果需要排序,您可以(->> a (group-by :a) (sort-by key) vals)
    • (->> a (sort-by :a) (partition-with :a))
    • @lgrapenthin - 谢谢,这实际上是我一直在寻找的。只是一个小的更正它应该是分区的。
    • @ViktorK.:谢谢。
    猜你喜欢
    • 2019-09-16
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-04-17
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多