2

我想知道是否有一种功能性的方法可以在 Maxima 中将操作应用于列表的每个元素,而不必遍历列表?

例如,如果我想a:[1,2,3]从列表中删除列表的每个元素b:[5,4,3,2,1]。显然,类似:

f(a,b):=
block(
[aList:a, newList:b],
for k thru length(aList)
do newList: delete(aList[k],newList) 
);

我只是想知道是否有更直接的方法?我认为apply可能有效,但无法弄清楚,因为它似乎将整个列表作为参数(与列表元素相比)。

4

1 回答 1

3

有几种不同的方法可以实现这一点。一种方法是将参数视为集合并应用setdifference

(%i2) a: [1, 2, 3] $              

(%i3) b: [5, 4, 3, 2, 1] $

(%i4) setify(a);
(%o4)                       {1, 2, 3}
(%i5) setify(b);
(%o5)                    {1, 2, 3, 4, 5}
(%i6) setdifference (setify(b), setify(a));
(%o6)                        {4, 5}
(%i7) listify(%);
(%o7)                        [4, 5]

如果a并且b确实是集合,则有效,即顺序无关紧要,并且元素是唯一的。

其他方式:

(%i8) sublist (b, lambda ([x], not member(x, a)));
(%o8)                        [5, 4]

我猜这个sublist方法做了更少的假设,所以它更普遍适用。

于 2021-01-11T17:31:04.700 回答