计算列表的元素,使用模式

count elements of list,using pattern

我有一些问题,有人可以告诉我如何解决吗?

1)如何计算特定于级别的列表元素,独立于排序 Exrp? 就像元素子集的数量一样。 例如 {{1,2,3,4,5},{5,6,7,8,9}} ,在 1 级它应该产生 10。 我一直在尝试通过 Count[] 来完成此操作,但它不起作用,所以即使我选择模式 _(我可以分别指定模式来计算它们,但我不能使用多模式(见下文),如果我指定 _ 那么它计算一些高于目标水平的列表)。

2)我如何使用列表作为函数参数(即列表必须包含特定的数学表达式)将 NumberQ 或 EvenQ 之类的东西断言到列表的内容,以及如何创建多模式,如(f[x_List ?NumberQ 或 EvenQ,y_List?NumberQ 或 EvenQ]

谢谢。

第一个问题已经在评论里回答了

对于第二个版本,-Q 函数不会自动线程化 和组合(因为有几种方法可以在列表中组合测试)。 你必须明确地做。

这是一种方法:

f[x_List,y_List]:= Join[x,y] /; (And@@Map[EvenQ,x] && And@@Map[EvenQ,y])

此语法定义了在满足右侧条件的情况下如何计算 ff 如果至少一项测试未得出 true,则将保持未评估状态。 如果你喜欢的那种测试经常来,你可以定义辅助功能:

测试列表是否仅包含偶数

evenlistQ[x_List]:= And@@Map[EvenQ, x] 

测试列表是否仅包含验证 test_A 和 test_B 的项目

AandBlistQ[x_List]:= And@@Map[testA[#]&&testB[#]&, x] 

测试列表是否仅包含验证 test_A 或 test_B

中至少一项的项目
AorBlistQ[x_List]:= And@@Map[testA[#]||testB[#]&, x] 

测试列表是否完全验证 test_A 或完全验证 test_B

AlistOrBlistQ[x_List]:= (And@@Map[testA,x] || And@@Map[testB,x])

然后你可以写

f[ x_List?evenlistQ, y_List?evenlistQ] := Join[x,y]

仅当两个参数都是验证您的要求的列表时才进行评估,否则不进行评估。

最后一个形式等同于

f[ x_List, y_List] := Join[x,y] /; (evenlistQ[x]&& evenlistQ[y])

这为约束验证提供了更大的灵活性。