(wx)Maxima:如何对列表的每个成员迭代一个动作?
(wx)Maxima: how to iterate an action over every member of a list?
我想知道在 Maxima 中是否有一种功能性方法可以将操作应用于列表的每个元素,而不必遍历列表?
例如如果我想从列表 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]
我想 sublist
方法假设较少,因此更普遍适用。
我想知道在 Maxima 中是否有一种功能性方法可以将操作应用于列表的每个元素,而不必遍历列表?
例如如果我想从列表 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]
我想 sublist
方法假设较少,因此更普遍适用。