Я придумала решение, но оно неэффективно, поскольку оно генерирует нежелательные списки.
Если предположить, что нежелательные списки - это два списка, представляющие четные и нечетные элементы, то мы можем исправитьтот.(Устранение списка простых и квадратов - это целая «другая проблема». Ниже моя переделка вашего кода - мы не создаем дополнительные списки, а скорее с парой многократно используемых диапазонов , которые являются объектами, которые производятцелочисленные последовательности по мере необходимости, но не хранящиеся в памяти.
Ваш any()
дизайн эффективен в том, что аргументы являются выражениями генератора, а не списками, которые вычисляются по мере необходимости.Как только в массиве обнаруживается недостаток, все останавливается и возвращает False - ему не нужно обрабатывать остальное:
def squares(number):
return {x * x for x in range(int(number ** 0.5) + 1)}
def primes(number):
prime_set = set()
for i in range(2, number + 1):
for p in range(2, int(i ** 0.5) + 1):
if (i % p) == 0:
break
else: # no break
prime_set.add(i)
return prime_set
def primesquare(array):
if not array:
return True # define as the problem demands
length, maximum = len(array), max(array)
odd, even = range(0, length, 2), range(1, length, 2)
prime_set, square_set = primes(maximum), squares(maximum)
return all(array[i] in prime_set for i in even) and all(array[i] in square_set for i in odd) or all(array[i] in prime_set for i in odd) and all(array[i] in square_set for i in even)
Я восхищаюсь решением @ AndreySemakin на основе множеств (+1), и используйте наборы выше, но его решение генерирует те же списки, которые вы хотите исключить (только в форме наборов).