如何通过检查Maxima CAS中的索引从列表中删除多个元素?

时间:2018-04-04 18:30:38

标签: list maxima

我使用Maxima CAS创建列表:

a:makelist(i,i,1,20);

结果:

 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

我想缩小列表,只留下每三个元素。为了找到它,我检查列表的索引i:

mod(i,3)>0

找到元素。

我的代码:

l:length(a);
for i:1 thru l step 1 do if (mod(i,3)>0) then a:delete(a[i],a);

当然它不起作用,因为a的长度正在改变。

我可以使用第二个列表来完成:

b:[];
for i:1 thru l step 1 do if (mod(i,3)=0) then b:cons(a[i],b);

这是最好的方法吗?

2 个答案:

答案 0 :(得分:2)

正如已经知道的,有不同的方法可以解决这个问题。我的建议是构建一个你想要保留的索引列表,然后从中构造元素列表。 E.g:

(%i1) a:makelist(i,i,1,20);
(%o1) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
(%i2) ii : sublist (a, lambda ([a1], mod(a1, 3) = 0));
(%o2)                  [3, 6, 9, 12, 15, 18]
(%i3) makelist (a[i], i, ii);
(%o3)                  [3, 6, 9, 12, 15, 18]

关键部分是最后一步makelist(a[i], i, ii),其中ii是您要选择的索引列表。 ii可能以各种方式构建。以下是构建索引列表的另一种方法:

(%i4) ii : makelist (3*i, i, 1, 6);
(%o4)                  [3, 6, 9, 12, 15, 18]

答案 1 :(得分:1)

使用紧凑代码的一种简单方法(我不知道哪一个最好或更快):makelist(a[3*i],i,1,length(a)/3) 测试示例:

l1:makelist(i,i,1,12)$
l2:makelist(i,i,1,14)$
l3:[2,3,5,7,11,13,17,19,23,29]$
for a in [l1,l2,l3] do (
    b:makelist(a[3*i],i,1,length(a)/3),
    print(a,"=>",b)
)$

结果:

[1,2,3,4,5,6,7,8,9,10,11,12] => [3,6,9,12]

[1,2,3,4,5,6,7,8,9,10,11,12,13,14] => [3,6,9,12]

[2,3,5,7,11,13,17,19,23,29] => [5,13,​​23]