の任意の数のリストの値のすべての組み合わせを反復処理します。リストを別のリストのリストに挿入する必要がある回答を投稿しました。 InsertInto 関数は、挿入されたリストを要素に解凍しますが、これは私が望むものではありません。 リストの末尾の 1 つ先の要素に代入ステートメントを使用しました。これにより、リストが要素として挿入されます。 もう 1 つの選択肢は、リストを挿入する前に別のリストでラップすることです (ラップされたリストが解凍され、元のリストが挿入されます)。
リストをリストに挿入するより良い方法はありますか? result と p は両方ともリストです。
結果[ N 個のアイテム(結果) + 1 】 = pこれは少し冗長ですが機能し、 p がリストの最後の要素の直後に格納されていることがかなり明確に見えます。 拡張には適していますが、他の場所には挿入できません。
結果={"a"};
p={"b","c"};
result[N 項目 ( result ) + 1] = p; // 冗長だが意図は明らか
表示(結果);
/*:
結果 = {"a"、{"b"、"c"}}; // 良い
Insertinto( result, p ) p ではなく p の要素を挿入するため、機能しません。
結果={"a"};
p={"b","c"};
insertinto( result, p ) ; // 正しいように見えますが...
表示(結果);
/*:
結果 = {"a"、"b"、"c"}; // 私が望むものではありません
insertinto( result, evallist( { p } ) )動作しますが、割り当てよりも読みにくいようです。 どこにでも挿入できますが、余分なコピーが作成されます。
結果={"a"};
p={"b","c"};
insertinto( result, evallist( { p } ) ) ; // リストの余分なコピーが作成されるため、読みにくくなります
表示(結果);
/*:
結果 = {"a"、{"b"、"c"}}; // 良い: 私が望むもの
はい。 私は evallist() アプローチを使用しましたが、説明するにはコメントが必要だといつも感じます。 私の元のコード (上部のリンク) では、挿入の合間に p を変更し続けるため、p への参照を挿入するだけでは済みません。
次回はそれを使うかもしれません。 たとえそれがより複雑な(内部で)データ構造を使用していても、それはより単純に見えます、そして私はすでにnitems(...)+1 ...でインデックスを生成しているので、そう、それはより良い選択かもしれません。
直接的な解決策ではありませんが、回避策として、次のような連想配列を使用する傾向があります。 @pmrozあなたのリンクで提案されています。
FWIW 私は常に 2 番目の例で EvalList () の方法でそれを行います。 このようにして、必要になるまで評価しないこともできると思います...これがあなたに多くの価値があるかどうかはわかりません(?)
result = {"a"};
p = {"b", "c"};
Insert Into( result, {p} ); //don't evaluate p here... but of course p is non-static
show(result[2][1]); //can still access elements of p if desired
Show( Eval List( result ) ); //or can eval to see the whole thing
