任务:
编写一个Python函数,该函数返回列表中多少个整数元素是同一列表中其他元素的精确平方。假定该列表不包含负数,并且没有重复项。
此函数接收一个列表并返回计数。例如,如果x为[3,4,0,2,1,9,25],则sum返回4,因为3 * 3 = 9,0 * 0 = 0,1 * 1 = 1,2 * 2 = 4。
这是我的代码:
x = [3,4,0,2,1,9,25]
def count(x):
sum = 0
for i in x:
if i*i in x is True:
sum += 1
return sum
当我运行count(x)时,输出为0而不是4,我认为逻辑是正确的。
答案 0 :(得分:3)
运算符is
是comparison operator,因此当您执行i*i in x is True
时,Python会将其解释为i*i in x and x is True
。在这种情况下,x is True
始终为假。
请注意,由于True
返回一个布尔值,因此您无需明确地将值与in
进行比较。
x = [3,4,0,2,1,9,25]
def count(x):
sum = 0
for i in x:
if i*i in x: # Simply remove 'is True'
sum += 1
return sum
尽管如此,由于列表查找,上述结果为 O(n 2 )。您可以使用set
进行恒定时间查找,并使用True == 1
和False == 0
来使用sum
并获得有效的 O(n)算法。
def count(x):
x_set = set(x)
return sum(i*i in x_set for i in x)
答案 1 :(得分:1)
int(True)
返回1
,而int(False)
返回0
,所以为什么不只使用sum
的一行:
def count(x):
return sum(i*i in x for i in x)
演示:
x = [3,4,0,2,1,9,25]
def count(x):
return sum(i*i in x for i in x)
print(count(x))
输出:
4
或更快速:
def count(x):
return sum([i*i in x for i in x])
演示:
x = [3,4,0,2,1,9,25]
def count(x):
return sum([i*i in x for i in x])
print(count(x))
输出:
4
您的代码为何无效的摘要:
您的代码存在的问题是,在代码末尾不需要is True
,否则也可以解决问题
答案 2 :(得分:1)
当您这样做:
{
"username": "charly",
"firstName": "Charly-u",
"lastName": "Brown",
}
实际上是chains the conditional operators,因此它等效于:
if i*i in x is True:
这不是您想要的。
您可以改为使用括号来明确地这样做:
i*i in x and x is True:
您的代码将起作用。
但是您实际上并不需要将布尔表达式与布尔值进行比较。您可以改为:
if (i*i in x) is True:
答案 3 :(得分:-1)
您可以执行 list理解而不是使用创建函数
import java.util.*;
public class TriangleSingle
{
public static void generate(int x) //Generates the Triangle
{
int len, count;
len = 1;
count = 1;
for (int k = 1; k <= x; k++)
{
System.out.print("*");
count --;
if (count == 0)
{
System.out.println();
len ++;
count = len;
}
}
if (count!= 0 || count != len)
{
System.out.println("*"); //Completes the triangle if needed
// This is the **problem spot**
}