0

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]]

試してみましたが、非常に複雑なループがあり、うまくいきません..これ以上素晴らしいアイデアはありませんか?

4

2 に答える 2

0

ネストされたseq呼び出しのペアを試してください。

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

[seq(seq(subs(r=op([x,r]),L),r in K),K in L)];
于 2011-11-21T06:44:07.710 に答える
0

私は Maple 7 でこのコードを書いていますが、ほとんどすべてのバージョンの Maple で動作するはずです。最初に元のネストされたリストを 2 つの単純なリストに分割することで、作業が簡単になると思います。

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))];

これが可能な限り最も洗練されたソリューションではないことは認めます。残念ながら、今のところこれほど単純なものは思い浮かびません。

于 2011-10-27T13:40:48.510 に答える