【问题标题】:Pattern to match list of identical elements匹配相同元素列表的模式
【发布时间】:2011-06-23 00:06:31
【问题描述】:

我正在寻找一个与由相同(在 Equal[] 的意义上)原子对象组成的(可能为空的)列表匹配的模式,但我无法弄清楚。任何帮助将不胜感激。

【问题讨论】:

  • 模式,你的意思是正则表达式吗?
  • 您是否尝试过使用 PatternSequence? reference.wolfram.com/mathematica/ref/PatternSequence.html
  • @Dan I Mathematica 有 模式,即用于匹配 Mathematica 语言/数据结构的表达式,以及用于 字符串的 StringExpressions 和 RegularExpressions 。 Reddish 似乎是指模式。
  • 我指的是 Mathematica 模式,而不是正则表达式。
  • @Ben PatternSequence 不能满足我的需要。

标签: wolfram-mathematica pattern-matching


【解决方案1】:

到目前为止,所有响应似乎都忽略了要匹配的对象必须是原子的要求。以下是这样做的:

Cases[testList, {a___?AtomQ} /; Equal[a]]

如果您没有在 Equal 的意义上定义 相同,您可以使用:

Cases[testList, {(a_?AtomQ) ...}]

通过稍微修改的测试列表,您会看到其他方法不符合要求

testList = {{1, 1.0, 1.0}, {a, b, c}, {Exp[Pi] + 1, Exp[Pi] + 1, Exp[Pi] + 1}, {}, {3}};

它们也都错误地匹配第三个元素。

【讨论】:

  • 糟糕。是的,我完全错过了。
  • 谢谢,您的三个匹配行为略有不同的版本非常有启发性。
  • @reddish 不要忘记接受你最喜欢的答案。 ;-)
【解决方案2】:

这对你有用吗?

testList = {
  {1, 1.0, 1.},
  {a, b, c},
  {0, Exp[Pi*I] + 1.0, Sin[Pi]}
}
Cases[testList, _List?(Equal @@ # &)]

【讨论】:

  • 我不知道为什么,但我通常倾向于忘记_?(cond) 语法。记住它的好例子。
【解决方案3】:

使用Condition,而不是PatternTest

In[31]:= testList = {{1, 1.0, 1.}, {a, b, c}, {0, Exp[Pi*I] + 1.0, 
    Sin[Pi]}, {}, {3}};

Cases[testList, {a___} /; Equal[a]]

Out[32]= {{1, 1., 1.}, {0, 0., 0}, {}, {3}}

(并扩展 Mark 的测试用例列表以涵盖空列表和单例列表。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多