Этот ответ не предназначен для демонстрации наиболее эффективного метода, а скорее является альтернативным методом, который служит педагогической цели для демонстрации некоторых важных основных функций в Mathematica.
Ответ nixeagle позволяет избежать явного тестирования каждого элемента списка.Если тест не поддается включению в третий аргумент Select
, то может быть полезно следующее:
Для этого вам нужно узнать о стандарте *Функции 1012 *Or
и And
, а также Map
(/@
) и Apply
(@@
) команд, которые чрезвычайно важны для обучения любому пользователю Mathematica.(см. этот учебник )
Вот простой пример.
In[2]:= data = RandomInteger[{0, 10}, {10}]
Out[2]= {10, 1, 0, 10, 1, 5, 2, 2, 4, 1}
In[4]:= # > 5 & /@ data
Out[4]= {True, False, False, True, False, False, False, False, False, \
False}
In[6]:= And @@ (# > 5 & /@ data)
Out[6]= False
Здесь происходит то, что вы отображаете функцию («больше 5»)) к каждому элементу списка, используя Map
, чтобы получить список значений True / False.Затем вы применяете стандартную логическую функцию And
ко всему списку, чтобы получить единственное логическое значение.
Это все основные функции в Mathematica, и я рекомендую вам внимательно прочитать документацию по этим функциям и попрактиковатьсяих использование.
Это не самый эффективный метод, но для небольших проблем вы не заметите разницу.
In[11]:= Do[Select[data, ! # > 5 &, 1] === {}, {10000}] // Timing
Out[11]= {0.031, Null}
In[12]:= Do[And @@ (# > 5 & /@ data);, {10000}] // Timing
Out[12]= {0.11, Null}
Для Exists
альтернативой Select
будет MatchQ для шаблонов или MemberQ
для явных значений.В документации есть несколько полезных примеров.