计算列表的元素,使用模式
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])
此语法定义了在满足右侧条件的情况下如何计算 f
。 f
如果至少一项测试未得出 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])
这为约束验证提供了更大的灵活性。
我有一些问题,有人可以告诉我如何解决吗?
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])
此语法定义了在满足右侧条件的情况下如何计算 f
。 f
如果至少一项测试未得出 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])
这为约束验证提供了更大的灵活性。