LISP中的关联列表与C#中的字典是一样的吗?
我正在读一本关于CommonLisp的书,作者说:“列表由存储在列表中的键/值对组成。” 这让我想,这和C#中的措辞是不是一样?LISP中的关联列表与C#中的字典是一样的吗?,c#,lisp,common-lisp,C#,Lisp,Common Lisp,我正在读一本关于CommonLisp的书,作者说:“列表由存储在列表中的键/值对组成。” 这让我想,这和C#中的措辞是不是一样? 如果是,为什么?是的,基本上是一样的。也称为关联数组(perl)和映射(java和其他)。它是从键到值的映射。因此,它可以起到类似于字典的作用。在Lisp的发展过程中,添加了具有类似用途的哈希表。是的,它们非常相似,具有类似的用途,但至少有一个显著的区别: 一个.NET字典不能有多个具有相同密钥的项 显然,: 在关联列表中搜索具有给定键的关联时,如果存在多个键,则返回
如果是,为什么?是的,基本上是一样的。也称为关联数组(perl)和映射(java和其他)。它是从键到值的映射。因此,它可以起到类似于字典的作用。在Lisp的发展过程中,添加了具有类似用途的哈希表。是的,它们非常相似,具有类似的用途,但至少有一个显著的区别: 一个.NET
字典
不能有多个具有相同密钥的项
显然,:
在关联列表中搜索具有给定键的关联时,如果存在多个键,则返回找到的第一个键
alists和哈希表(字典使用)之间的比较,因为似乎还没有人涉及到这一点: 主义者:
- 易于实现(只是一个配对列表)
- 具有线性时间查找(因此仅对小列表有用)
- 需要多做一点努力来实现(特别是,您必须为键实现一个稳定的哈希函数)
- 已摊销固定时间查找
- 作为一个列表:键-值对(Lisp的alists),一个交错键和值的平面列表(Lisp的plists),作为一对键和值的列表
- 作为一个表,可以是Lisp的哈希表/Java的哈希表或其他类型的表
- 作为树(Java的树映射)
- 等
assoc
和rassoc
分别从左侧和右侧查找元素。(因此,与传统词典不同,同一个键可以有多个映射到同一个表中的不同值)。还有acon
和pairlis
来构建alist
编辑最后,没有从列表中删除项目的标准功能。
您可以使用
(删除key-alist:key#car)
删除元素。但是请注意,此操作会保留原始列表,并返回一个修改后的列表。尽管Perl程序员倾向于在一般情况下称其为“哈希”,尽管我们知道在好的一天,它们应该被称为“关联数组”。只是为了好玩,JavaScript调用了相同的概念“Objects”。.NET的字典
是使用哈希表实现的。因此,触及列表和哈希表之间的区别可能更有用。我可以。但不需要。通常列表是破坏性的,很容易替换现有值。从列表中删除是(remove key alist:key#car)
。