使用模式计算列表的元素

时间:2016-03-06 18:32:02

标签: wolfram-mathematica

我有一些问题,有人可以说明如何解决这些问题吗?

1)如何计算特定于级别的列表元素,与排序Exrp无关? 就像元素子集的数量一样。 例如{{1,2,3,4,5},{5,6,7,8,9}},在第1级它应该产生10。 我一直试图通过Count []完成这个,但它不工作,所以即使我选择模式_(我可以单独指定模式,但我不能使用多模式(见下文),如果我指定_然后它计算一些高于目标水平的清单。)

2)我如何使用list作为函数参数(即列表必须包含特定的mathematica expr。)以及如何创建多个模式(f [x_List?NumberQ或EvenQ,y_List)来向列表内容断言像NumberQ或EvenQ这样的内容?NumberQ或EvenQ]

感谢。

1 个答案:

答案 0 :(得分:1)

第一个问题已在评论中得到解答。

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

这是一种方法:

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

此语法定义如果满足右侧条件,如何计算f。如果至少有一个测试没有成功,f将保持未评估状态。 如果您喜欢的测试类型经常出现,您可以定义辅助功能:

测试列表是否仅包含偶数

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])

允许更灵活地进行约束验证。