如何迭代Elisp哈希表中的项(键,值)?
我使用(make-hash-table)
创建了一个哈希表(地图,字典),并用不同的项填充它。在Python中,我可以通过以下方式迭代dicts:
for k in d # iterate over keys
for k in d.keys() # same
for k in d.values() # iterate over values
for k in d.items() # iterate over tuples (key, value)
我怎么能以最简洁和优雅的方式做同样的事情,最好没有循环宏?
答案 0 :(得分:13)
(maphash (lambda (key value) ....your code here...) hash-table)
答案 1 :(得分:9)
我打算给自己做一些宣传,所以带上一粒盐,但基本上,这是你的选择:
maphash
- 这是内置的迭代原语,从根本上说,没有其他方法可以存在。
(loop for KEY being the hash-key of TABLE for VALUE being the hash-value of TABLE ...)
可在cl
包中找到。无论如何,它将在内部使用maphash
,但它会在不同的迭代原语之上为您提供一些统一。您可以使用loop
宏来迭代多个不同的东西,并通过从视线中删除技术信息来减少混乱。
http://code.google.com/p/i-iterate/这是一个我正在努力提供的库,可以在Emacs Lisp中以不同的方式提供更多通用的迭代方式。它受Common Lisp Iterate库的启发,但它远离它(但是,一些基本原则仍然存在)。如果您要尝试此库,则哈希表上的迭代将如下所示:(++ (for (KEY VALUE) pairs TABLE) ...)
或(++ (for KEY keys TABLE) ...)
或(++ (for VALUE values TABLE) ...)
。
我将尝试描述使用cl
loop
或i-iterate
的利弊和优点。
loop
不同,iterate允许一次迭代多个哈希表(但是你必须知道它产生的额外成本:必须将第二个,第三个哈希表的密钥收集到一个哈希表中。在迭代之前列出,这是在幕后完成的。)cl
库。除此之外,哈希表的完整版迭代表如下所示:(for VAR pairs|keys|values TABLE &optional limit LIMIT)
,其中LIMIT
代表您想要查看的元素数量(它将生成更多高效的代码,然后如果你使用更多的通用工具打破循环。)
答案 2 :(得分:3)
maphash
是你想要的功能。另外,我建议您查看手册(info "(elisp) Hash Tables")
答案 3 :(得分:1)
从2013年开始,有一个第三方库ht
,它提供了许多方便的功能来操作Elisp哈希表。
假设您有一个哈希表,其中键是字符串,值是整数。要遍历哈希表并返回列表,请使用ht-map
:
(ht-map (lambda (k v) (+ (length k) v)) table)
;; return list of all values added to length of their keys
ht-each
只是maphash
的别名。上述2个函数还有anaphoric个版本,称为ht-amap
和ht-aeach
。他们不是接受匿名函数,而是公开变量key
和value
。这是与上面的表达式相同的表达式:
(ht-amap (+ (length key) value) table)
答案 4 :(得分:0)
我本来希望把它写成评论,但我的名声 具有讽刺意味的是,这使我无法在适当的时候写出这 格式...
loop
被视为已弃用,cl
库也被弃用,
因为它不遵守所有符号前缀的约定
一个公共的库前缀,因此用符号污染了obarray
没有明确的图书馆协会。
而是使用cl-lib
定义相同的函数和宏但是
将它们命名为cl-loop
和cl-defun
代替loop
和defun*
cl-macs
。如果您只需要宏,则可以导入{{1}}
代替。