我想识别数字列表中完美正方形的数字,例如:
a = [3, 4, 8, 16, 21, 58, 144] # return [4, 16, 144]
答案 0 :(得分:7)
一旦方法是构建一个谓词(一个返回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]
或者对于那些喜欢列表推导而不是 filter():
的人>>> [x for x in [3, 4, 8, 16, 21, 58, 144] if is_perfect_square(x)]
[4, 16, 144]
完美的平方测试通过获取数字的平方根并将其四舍五入到最接近的整数,重新平方并将其与原始数字进行比较来工作。平方根步骤可能会出现一点舍入误差,但舍入整数将是精确的。除了非常大的输入外,这应该有点强大。
答案 1 :(得分:2)
您可以合并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()]
答案 2 :(得分:0)
您可以尝试:
>>> 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]
答案 3 :(得分:-1)
将此测试用于完美正方形:
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]