вставить элемент в каждую позицию вложенного списка - PullRequest
0 голосов
/ 06 октября 2011

В 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 голосов
/ 21 ноября 2011

Попробуйте вложенную пару вызовов seq.

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

[seq(seq(subs(r=op([x,r]),L),r in K),K in L)];
0 голосов
/ 27 октября 2011

Я пишу этот код на 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))];

Я допускаю, чтоэто может быть не самое элегантное решение.К сожалению, сейчас мне в голову не приходит ничего проще.

...