2つのリストを連結する方法は?


13

申し訳ありませんが、elispは私のベストではありません。この方法で文字列の2つのリストを組み合わせる必要があります。

("a" "b" "c") + ("d" "e" "f") -> ("a" "b" "c" "d" "e" "f")

さて、順序は重要ではないので、このコードを書きました。

(while lista
  (add-to-list 'listb (car lista)) 
  (setq lista (cdr lista)))

それは動作しますが、私はすでにこれを行う機能があるのだろうかと思っています。

どんな手掛かり?前もって感謝します。


4
Elispマニュアルのノード構築リストを参照してください。
ドリュー

2
appendここで正しい答えですが、それを行う別の(破壊的な)方法があります(setcdr (last a) b)
ショーンオールレッド

1
リストに取り組んでいますか?dash.el(-concat '(1) '(2 3) '(4)) ;; => '(1 2 3 4)
エビンス

add-to-listLispコードでは使用しないでください(docstringでこれを言っています)。代わりに、を使用しますpush
ラドンロズバラ

回答:


24

また、単にappendを使用することもできます。

(append '("a" "b" "c") '("d" "e" "f"))

2
そして、(nconc '("a" "b" "c") '("d" "e" "f"))
法律家

1
ああ、はい、確かにappendここの方が良いようです。
ジャンピエール

nconcは機能しますが、変数にリストを格納すると、nconcによってリストが変更されます。例えば(let((a '(1 2 3))(b'(3 4 5)))(nconc ab)a)は変数を変更します。
ジョンキッチン

1
FYI cl-concatenateappendTYPEがの場合に使用するlistため、両方の答えが同じ結果を生成します。
phils

はい、それは確かに仕事をします。あなたの助けに感謝します。
ダニエレ

3

concatenateは、「cl.el」の「cl-concatenate」のエイリアスです。

(TYPE SEQUENCEを連結...)

引数SEQUENCEsをタイプTYPEのシーケンスに連結します。

あなたの例のために

(concatenate 'list '("a" "b" "c") '("d" "e" "f"))

で定義されclているため、(require 'cl)最初に設定する必要がある場合がcl-concatenateあります。

また、@ philsが指摘したcl-concatenateようにappend、TYPEがの場合に呼び出す'listのは、次のソースですcl-extra.el

(defun cl-concatenate (type &rest sequences)
  "Concatenate, into a sequence of type TYPE, the argument SEQUENCEs.
\n(fn TYPE SEQUENCE...)"
  (pcase type
    (`vector (apply #'vconcat sequences))
    (`string (apply #'concat sequences))
    (`list (apply #'append (append sequences '(nil))))
    (_ (error "Not a sequence type name: %S" type))))

したがって、リストのみを使用している場合は、append@ John Kitchinが指摘したように、を直接使用する方が簡単です。

最後に、@ lawlistが言及しましたnconc

nconcは、「Cソースコード」の組み込み関数です。

(nconc&restリスト)

リストを変更して、任意の数のリストを連結します。最後の引数のみが変更されず、リストである必要はありません。

これが意味するもの:

(nconc '("a" "b" "c") '("d" "e" "f"))
=> ("a" "b" "c" "d" "e" "f")

(setq l1 '("a" "b" "c")
      l2 '("d" "e" "f"))
(nconc l1 l2)
=> ("a" "b" "c" "d" "e" "f")
l1
=> ("a" "b" "c" "d" "e" "f")
l2
=> ("d" "e" "f")

ありがとう、しかし、2番目と3番目の引数が変数であり、明示的なリストではない場合、エラーを返すようです。
ダニエレ

1
(setq l1 '("a" "b" "c") l2 '("d" "e" "f")) (concatenate 'list l1 l2)大丈夫です。
ジャンピエール

@Daniele 変数を引用しようとしていたのではないかと思います。つまり、変数はリストの値に評価されません。(つまり、あなたが望むvarnameよりも'varname)。
phils

完全を期すために、Emacs> = 25:(のseq-concatenate(require 'seq))で任意のタイプのシーケンスを連結する非CLの方法についても言及しますが、これは単にラップしcl-concatenateます。
バジル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.