Python Clojure中的地图是否有序?

Python Clojure中的地图是否有序?,python,clojure,Python,Clojure,我来自Python,在Python中,映射(即dict)在默认情况下是不排序的。开始学习Clojure时,我发现: (def point {:x 5 :y 7}) => #'user/point point => {:x 5, :y 7} (let [{:keys [x y]} point] (println "x:" x "y:" y)) x: 5 y: 7 在我看来,要使这种分解工作正常,必须依赖于正在排序的映射(当然,还要记住顺序)。这是真的吗?Clojure映射不是有序

我来自Python,在Python中,映射(即dict)在默认情况下是不排序的。开始学习Clojure时,我发现:

(def point {:x 5 :y 7})
=> #'user/point
point
=> {:x 5, :y 7}
(let [{:keys [x y]} point]
  (println "x:" x "y:" y))
x: 5 y: 7

在我看来,要使这种分解工作正常,必须依赖于正在排序的映射(当然,还要记住顺序)。这是真的吗?

Clojure映射不是有序的,尽管有一种像
排序映射这样的东西。您得到的顺序是一致的,因为您正在使用键访问这些值。查看更改密钥名称时发生的情况

user=> point
{:a 5, :b 7}

user=> (let [{:keys [x y]} point]
  #_=>   (println "x:" x "y:" y))
x: nil y: nil
nil

user=> (let [{:keys [a b]} point]
  #_=>   (println "a:" a "b:" b))
a: 5 b: 7

我有一个与您的问题相关的公认答案。

Clojure有三种内置映射类型:数组映射、哈希映射和排序映射

其中,散列映射和排序映射是无序的,但数组映射实际上是有序的:这在上的官方文档中进行了解释

但是,需要注意的是,数组映射主要是出于性能原因而使用的,即较小的映射文本(≤ 8个条目)编译为数组映射而不是哈希映射,如果将新键关联到数组映射上会导致哈希映射超过大小阈值,则会返回哈希映射。可以通过显式调用
clojure.core/array map
来构造更大的数组映射,但是数组映射操作是O(n),因此在存在太多条目时会变得相当慢,因此这不是一个通用的有序映射数据结构


如果您需要一个无论大小都能提供良好性能的有序映射,您应该使用Alan Malloy的/Flatland的–它提供由内置数据结构支持的持久有序集和映射(一个集或一个映射+一个向量来跟踪插入顺序)。

Oh!谢谢,我没有意识到实际的键被用作参数。这让我感觉好多了。Lol指向已订购的链接指向旧版本。这是最新的,它在文档中的某个地方描述了Clojure使用数组映射类型进行小映射吗(≤ (八项)?有趣的是,你是怎么得到这个数字的。还是你通过实验得到的?