Шаблон для сопоставления списка идентичных элементов - PullRequest
7 голосов
/ 23 июня 2011

Я ищу шаблон, который соответствует (возможно, пустому) списку, состоящему из идентичных (в смысле Equal []) атомных объектов, но я не могу понять это.Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

12 голосов
/ 23 июня 2011

Все ответы до сих пор, по-видимому, не соответствовали требованию, что сопоставляемые объекты должны быть атомарными . Это делает следующее:

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}};

они все также не соответствуют третьему элементу.

9 голосов
/ 23 июня 2011

Это у вас работает?

testList = {
  {1, 1.0, 1.},
  {a, b, c},
  {0, Exp[Pi*I] + 1.0, Sin[Pi]}
}
Cases[testList, _List?(Equal @@ # &)]
6 голосов
/ 23 июня 2011

Использование 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}}

(и расширение списка тестовых случаев Марка для охвата пустых и одноэлементных списков.)

...