8

How to iterate over items (keys, values) in Elisp hash-tables?

I created a hash-table (map, dictionary) using (make-hash-table) and populated it with different items. In Python i could iterate over dicts by:

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)

How can i do the same the most succinct and elegant way possible, preferably without loop-macro?

4

5 に答える 5

15

(maphash (lambda (key value) ....your code here...) hash-table)

于 2013-01-07T11:16:40.840 に答える
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 では一度に複数のハッシュ テーブルを反復処理できます (ただし、2 番目、3 番目などのキーの追加コストが発生することに注意する必要があります。反復処理の前にハッシュ テーブルをリストに収集する必要があります。これは後で行われます)。シーン)。
  • Iterate は間違いなくより多くの Lisp-y 構文を提供し、エディターでのフォーマットがより簡単です。
  • 反復を使用すると、反復を他の操作と組み合わせるためのオプションが増えます (将来的にはさらに増える可能性があります)。
  • これまでのところ、私を除いて誰も使用していません:) おそらくまだバグがあり、いくつかの点が作り直されている可能性がありますが、機能凍結に近づいており、適切に使用する準備が整っています.
  • 組み込みの反復プリミティブまたはclライブラリのいずれかに精通している人が大幅に増えています。

余談ですが、ハッシュ テーブルの反復処理の完全なバージョンは次のよう(for VAR pairs|keys|values TABLE &optional limit LIMIT)LIMITなります。より汎用的なツール)。

于 2013-01-07T12:23:10.347 に答える
3

maphash欲しい機能です。さらに、マニュアルを参照することをお勧めします(info "(elisp) Hash Tables")

于 2013-01-07T16:18:57.633 に答える
2

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 つの関数のアナフォリックバージョンもありht-amapますht-aeach。無名関数を受け入れる代わりに、変数keyとを公開しますvalue。上記と同等の式は次のとおりです。

(ht-amap (+ (length key) value) table)
于 2016-01-12T00:28:46.847 に答える
0

これをコメントに入れたかったのですが、皮肉なことに、私の評判の評価により、これを適切な形式で書くことができなくなりました...

loopこれは、clすべてのシンボルに共通のライブラリ プレフィックスを付けるという慣習に従わなかったため、ライブラリとの明確な関連付けのないシンボルでオブジェクト配列を汚染したためです。

代わりにcl-lib、同じ関数とマクロを定義する which を使用しますが、名前はcl-loopandcl-defunの代わりにloopand にしdefun*ます。マクロのみが必要な場合は、代わりにインポートできますcl-macs

于 2013-05-30T15:22:44.950 に答える