python - 检查列表是否包含交替素数和完美正方形
问题描述
我刚刚开始使用 Python 编程。我在检查给定列表是否包含交替的素数和完美正方形序列时遇到问题。该列表可以以素数或完美正方形开头。我想出了一个解决方案,但它效率不高,因为它会生成不需要的列表。这是否可以通过更高效的 Python 代码实现?
首先,我正在创建函数来生成素数列表以及完美平方,直到测试列表的最大值。功能squaretest()
和primecheck()
:
def squaretest(num):
sqlist=[]
i=1
while i**2 <= num:
sqlist.append(i**2)
i+=1
return sqlist
def primecheck(num):
primelist=[]
for i in range(2,num + 1):
for p in range(2,i):
if (i % p) == 0:
break
else:
primelist.append(i)
return primelist
然后我将给定的列表划分为偶数索引和奇数索引元素的列表,并根据 和 检查它们的所有primelist
元素squarelist
:
def primesquare(l):
if len(l)==1:
primelist = primecheck(l[0])
sqlist = squaretest(l[0])
return (l[0] in primelist) or (l[0] in sqlist)
else:
ol=[]
el=[]
for i in range(0,len(l),2):
ol.append(l[i])
for p in range (1, len(l),2):
el.append(l[p])
primelist = primecheck(max(l))
sqlist = squaretest (max(l))
return((all(x in primelist for x in el)) == True and (all(y in sqlist for y in ol)) == True) or ((all(x in primelist for x in ol)) == True and (all(y in sqlist for y in el)) == True)
有用。任何建议都会非常有帮助。
解决方案
您可以使用集合来检查列表的所有成员是否都在另一个列表中。
def primesquare(l):
if len(l) == 0:
return True
primelist = set(primecheck(max(l)))
sqlist = set(squaretest(max(l)))
ol = set(l[::2])
el = set(l[1::2])
odds_are_primes = ol.issubset(primelist)
odds_are_squares = ol.issubset(sqlist)
evens_are_primes = el.issubset(primelist)
evens_are_squares = el.issubset(sqlist)
return (odds_are_primes and evens_are_squares) or (odds_are_squares and evens_are_primes)