List (wx)Maxima:如何在列表的每个成员上迭代操作?

List (wx)Maxima:如何在列表的每个成员上迭代操作?,list,maxima,wxmaxima,List,Maxima,Wxmaxima,我想知道是否有一种功能性的方法可以将一个动作应用到列表的每个元素,以最大值表示,而不必在列表上循环 e、 g.如果我想从列表b:[5,4,3,2,1]中删除列表a:[1,2,3]中的每个元素。显然,类似于: f(a,b):= block( [aList:a, newList:b], for k thru length(aList) do newList: delete(aList[k],newList) ); 我只是想知道有没有更直接的方法?我原以为apply可能行得通,但无法理解,因为它似

我想知道是否有一种功能性的方法可以将一个动作应用到列表的每个元素,以最大值表示,而不必在列表上循环

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

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

我只是想知道有没有更直接的方法?我原以为
apply
可能行得通,但无法理解,因为它似乎将整个列表作为参数(相对于列表元素)。

有几种不同的方法可以实现这一点。一种方法是将参数视为集合并应用
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]

我想
子列表
方法所做的假设较少,因此更适用于一般情况。

顺便提一下,关于无显式循环的迭代的一般主题,请看
映射
。您是否建议在为列表的所有元素计算谓词的情况下使用相同的方法?例如,如果要确定列表
a
中的每个值是否等于1,那么类似
asublist:sublist(a,lambda([e],is(equal(e,1)))
的内容将
length(a)
length(asublist)
进行比较?我发现自己需要相当多依赖于列表项谓词组合的条件逻辑,并试图找出实现这一点的简单/直接方法。如果这是完全不同的,我将发布一个单独的问题:)在这种情况下,你想要的是
每一个
。另请参见
some
。有时,分两步工作很有帮助,首先计算每个项目的真/假,然后查看它们是否全部/部分/无等于真。这将是
foo:map(P,L)
,其中P是谓词,L是列表,然后
every(identity,foo)
。注意<代码>映射
每个
一些
都可以处理具有两个或多个参数的函数,参考手册中给出了一些示例。