Простое и довольно эффективное решение должно отсортировать оба набора и затем сравнить их для равенства:
bool equal = collection1.OrderBy(i => i).SequenceEqual(
collection2.OrderBy(i => i));
Этот алгоритм является O (N*logN), в то время как Вашим решением выше является O (N^2).
, Если наборы имеют определенные свойства, можно быть в состоянии реализовать более быстрое решение. Например, если оба из Ваших наборов являются наборами хеша, они не могут содержать дубликаты. Кроме того, проверка, содержит ли набор хеша некоторый элемент, очень быстра. В этом случае алгоритм, подобный Вашему, вероятно, был бы самым быстрым.
В первом случае исключение вызывается компилятором, который запускает до , структура try / except
существует даже (так как это сам компилятор настроит сразу после разбора). Во втором случае компилятор запускается дважды - и возникает исключение, когда компилятор запускается как часть eval
, после первый запуск компилятора уже настроен try / except
.
Итак, чтобы перехватить синтаксические ошибки, так или иначе, вы должны организовать, чтобы компилятор запускался дважды - eval
односторонний, явный Встроенная функция compile
вызывает другую, import
очень удобен (после записи кода в другой файл), exec
и execfile
других возможностей пока нет. Но как бы вы это ни сделали, синтаксические ошибки могут быть обнаружены только после того, как компилятор запустит первый раз для настройки необходимых вам блоков try / except
!
Краткий ответ: Нет.
Синтаксические ошибки возникают при анализе кода, что для нормального кода Python происходит до выполнения кода - код не выполняется внутри блока try / except поскольку код не выполняется, точка.
Однако, когда вы оцениваете или выполняете какой-либо код, вы анализируете его во время выполнения, чтобы вы могли поймать исключение.