【问题标题】:How to convert map to a sequence?如何将地图转换为序列?
【发布时间】:2014-05-01 05:37:16
【问题描述】:

this question的答案解释了如何将映射、序列等转换为各种序列和集合,但不说如何将映射转换为交替键和值的序列。这是一种方法:

(apply concat {:a 1 :b 2})
=> (:b 2 :a 1)

有些人可能天真地认为会产生相同结果的替代方案,但不要这样做,包括将地图传递给vecvectorseqsequenceinto []into ()flatten。 (有时尝试比思考更容易。)

还有什么比apply concat更简单的吗?

【问题讨论】:

  • “更简单”对您意味着什么?为什么你想要更简单的解决方案? apply concat 至少对我来说似乎是非常简单的解决方案。
  • apply concat 很好,@ymonad。我不需要更简单的解决方案。通常会发现有一个 Clojure 函数可以做一些简单而明显的事情(在这种情况下,将映射转换为序列),而人们没有意识到会产生这种效果。了解这些选项很有帮助。 (我还想,一般来说,我觉得使用apply 除非你有一个集合参数,它通常是一个列表的rest,在它的first 中有一个函数,我不知道...,美学上令人不快。)
  • 急切转换为交替键和值的向量:(reduce into {:a 1 :b 2})

标签: clojure


【解决方案1】:

你也可以这样做

(mapcat identity {:a 1 :b 2})

(mapcat seq {:a 1 :b 2})

【讨论】:

    【解决方案2】:

    正如@noisesmith 在下面轻轻暗示的那样,以下答案很诱人,但错误:作为对其他粗心的人的警告!反例:

    ((comp flatten seq) {[1 2] [3 4], 5 [6 7]})
    ; (1 2 3 4 5 6 7)
    

    (comp flatten seq) 完成这项工作:

    ((comp flatten seq) {1 2, 3 4})
    ; (1 2 3 4)
    

    flatten 本身不会:

    (flatten {1 2, 3 4})
    ; ()
    

    我很惊讶它不起作用,在这种情况下它应该返回nil,而不是()

    您提到的其他人都没有:vecvector ... 对地图以序列形式呈现的各个 [键值] 对做任何事情。

    【讨论】:

    • flatten 几乎总是使用错误的东西,它会破坏键和值的结构(如果有的话)
    • @noisesmith 我同意。 OP 的解决方案——本质上是(partial apply concat)——是准确和可信的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多