在嵌套列表的每个位置插入元素

时间:2011-10-06 03:43:18

标签: maple

在Maple 15中,我有一个像这样的嵌套列表(只有2个嵌套级别):

[[a,b],[c],[d,e,f]]

我想从那个创建6个列表(元素数量......),如下所示:

[[x,a,b],[c],[d,e,f]]
[[a,x,b],[c],[d,e,f]]
[[a,b],[x,c],[d,e,f]]
[[a,b],[c],[x,d,e,f]]
[[a,b],[c],[d,x,e,f]]
[[a,b],[c],[d,e,x,f]]

我试过,但我有超级复杂的循环,它不起作用..更好的主意?

2 个答案:

答案 0 :(得分:0)

我在Maple 7上编写此代码,但它应该适用于几乎任何版本的Maple。我觉得通过首先将原始嵌套列表剥离成两个简单的列表来做事更容易:

input:=[[a,b],[c],[d,e,f]];
flatlist:=[seq(op(input[n]),n=1..nops(input))]; % flat list of all elements
noels:=[seq(nops(input[n]),n=1..nops(input))]; % numbers of elements in sub-lists

将更多元素插入新的公寓列表会更容易:

newlists:=[seq([seq(flatlist[i],i=1..n-1),x,seq(flatlist[i],i=n..nops(flatlist))],n=1..nops(flatlist))];
newnoels:=[seq(seq([seq(noels[i],i=1..n-1),noels[n]+1,seq(noels[i],i=n+1..nops(noels))],m=1..noels[n]),n=1..nops(noels))];

必须将生成的平面列表转换回嵌套列表。这可以通过编写一个简单的函数来完成:

mergelists:=proc(flatlist,noels)
  local i,j,n,result;
  i:=0; result:=NULL;
  for n from 1 to nops(noels) do
    result:=result,[seq(flatlist[i+j],j=1..noels[n])];
    i:=i+noels[n];
  od;
  return [result];
end:

使用此功能,现在可以轻松将准备好的数据转换为所需格式:

output:=[seq(mergelists(newlists[n],newnoels[n]),n=1..nops(newlists))];

我承认这可能不是最优雅的解决方案。不幸的是,刚才没有什么比这更简单了。

答案 1 :(得分:0)

尝试嵌套seq次来电。

L:=[[a,b],[c],[d,e,f]]:

[seq(seq(subs(r=op([x,r]),L),r in K),K in L)];