Проверьте идеальные квадраты в списке

Я хочу определить числа, которые являются идеальными квадратами в списке чисел, например:

a = [3, 4, 8, 16, 21, 58, 144] # return [4, 16, 144] 

4 Solutions collect form web for “Проверьте идеальные квадраты в списке”

Когда подход заключается в создании предиката (функция возвращает true или false) и применяет его с filter () :

 >>> def is_perfect_square(n): return round(n ** 0.5) ** 2 == n >>> list(filter(is_perfect_square, [3, 4, 8, 16, 21, 58, 144])) [4, 16, 144] 

Или для тех, кто предпочитает перечислить списки по фильтру () :

 >>> [x for x in [3, 4, 8, 16, 21, 58, 144] if is_perfect_square(x)] [4, 16, 144] 

Идеальный квадратный тест работает, беря квадратный корень из числа и округляя его до ближайшего целого числа, перестраивая его и сравнивая с исходным номером. Шаг квадратного корня может иметь небольшую ошибку округления, но повторное квадратирование округленного целого будет точным. Это должно быть несколько надежным, за исключением очень больших входов.

Вы можете комбинировать math.sqrt() и is_integer() для фильтрации списка, например:

 import math a = [3, 4, 8, 16, 21, 58, 144] print [x for x in a if math.sqrt(x).is_integer()] 

Можешь попробовать:

 >>> square_list = [] >>> a = [3, 4, 8, 16, 21, 58, 144] >>> def perfect_square(number): return (number**0.5) % int(number**0.5) == 0 >>> for data in a: if perfect_square(data): square_list.append(data) >>> print square_list [4, 16, 144] 

Используя этот тест для идеальных квадратов:

 def is_square(n): for b in range(n): n -= (2 * b + 1) if n <= 0: return not n 

… вы можете найти те, которые появляются в a с простым пониманием списка:

 >>> [n for n in a if is_square(n)] [4, 16, 144] 
Python - лучший язык программирования в мире.