在迭代任意数量的列表中的所有值组合我发布了一个答案,需要将一个列表插入到另一个列表列表中。 InsertInto 函数将插入的列表解包为元素,这不是我想要的。 我对列表末尾之外的元素使用了赋值语句,这确实将列表作为元素插入。 另一种选择是在插入之前将列表包装在另一个列表中(因此它会解压包装的列表,并插入原始列表。)
有没有更好的方法将列表插入列表? result 和 p 都是列表。
结果[ N 项(结果) + 1 ] = p有点啰嗦,但很有效,而且看起来相当清楚,p 存储在列表中最后一个元素之后。 适合扩展,但无法插入其他地方。
结果={“a”};
p={"b","c"};
结果[N 项( 结果 ) + 1] = p; // 啰嗦,但意图很明确
显示(结果);
/*:
结果= {“a”,{“b”,“c”}}; // 好的
插入(结果,p)不起作用,因为它插入的是 p 的元素,而不是 p。
结果={“a”};
p={"b","c"};
插入(结果,p); // 看起来不错,但是...
显示(结果);
/*:
结果= {“a”,“b”,“c”}; // 不是我想要的
insertinto( 结果, evallist( { p } ) )有效,但似乎不如作业可读。 可以插入任何地方,但会生成额外的副本。
结果={“a”};
p={"b","c"};
insertinto( 结果, evallist( { p } ) ) ; // 制作列表的额外副本并且难以阅读
显示(结果);
/*:
结果= {“a”,{“b”,“c”}}; // 好:我想要的
是的。 我使用过 evallist() 方法,但总觉得它需要注释来解释。 在我的原始代码(顶部链接)中,我在插入之间不断更改 p,因此它不能只插入对 p 的引用。
下次我可能会用它。 它看起来更简单,即使它使用更复杂的(在幕后)数据结构,并且因为我已经使用 nitems(...)+1 生成索引...是的,它可能是更好的选择。
这不是一个直接的解决方案,但更多的是作为一种解决方案,我倾向于使用关联数组,类似于@pmroz在您的链接中建议。
FWIW 在第二个示例中我总是以 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
