import itertools,math
from functools import reduce
import operator
b=[(1, 2, 9), (1, 3, 8), (1, 4, 7), (1, 5, 6), (2, 3, 7), (2, 4, 6), (3, 4, 5)]
c= list(reduce(lambda x1,x2 : (float(x1)%math.sqrt(x1) and float(x2)%math.sqrt(x2)) , itertools.chain.from_iterable(b) ))
print(c)
在上面的代码中,我收到此错误:
ZeroDivisionError: float modulo
我的预期输出是:
[(1,2,9) ,(1,4,7)]
在这里,我需要b
中至少两个完美的正方形元素。
换句话说,我希望c
是b
中每个元组的列表,其中至少包含两个完美的正方形。
答案 0 :(得分:3)
我们可以通过测试每个元组中的每个项目并计算其中有多少个为完美正方形来解决此任务。要确定数字是否为理想的平方,我们使用辅助函数is_square
。要计算完美的平方,我们可以使用内置的sum
。
from math import sqrt
def is_square(n):
r = int(sqrt(n))
return r * r == n
b = [(1, 2, 9), (1, 3, 8), (1, 4, 7), (1, 5, 6), (2, 3, 7), (2, 4, 6), (3, 4, 5)]
c = [t for t in b if sum(is_square(u) for u in t) > 1]
print(c)
输出
[(1, 2, 9), (1, 4, 7)]
is_square(u)
如果True
是一个完美的正方形,则返回u
,否则返回False
。但是True
的数值为1,而False
的数值为0。因此,sum(is_square(u) for u in t)
累加了每个元组t
中的多少个数是理想平方。 / p>
答案 1 :(得分:1)
您可以用collections.Counter()
来计算完美平方,并检索具有至少2个完美平方的元组:
from math import sqrt
from collections import Counter
b = [(1, 2, 9), (1, 2, 9), (1, 3, 8), (1, 4, 7), (1, 5, 6), (2, 3, 7), (2, 4, 6), (3, 4, 5)]
def perfect_square(n):
return round(sqrt(n)) ** 2 == n
counts = Counter()
for i, tup in enumerate(b):
for number in tup:
if perfect_square(number):
counts[i, tup] += 1
print([k for (_, k), v in counts.items() if v >= 2])
哪些输出:
[(1, 2, 9), (1, 4, 7)]
注意:上面的Counter()
也可以写成:
counts = Counter((i, tup) for i, tup in enumerate(b) for number in tup if perfect_square(number))
但是,这变得很难阅读。