在Python中如何将数组/列表与数字进行比较
array = []
while len(array) < 1000:
i=2
if i%array == 0:
append.array(i)
i = i + 1
print array[999]
为了学习,我正在尝试找出第1000个质数。唯一的问题是,我找不到一种方法来检查一个数字i是否能被数组中的某个元素整除。像这样写:if i%array == 0:
是不对的,那正确的写法是什么呢?
3 个回答
你的代码:
array = []
while len(array) < 1000:
i=2
if i%array == 0:
append.array(i)
i = i + 1
print array[999]
你问:
if i%array == 0: 这个语法不对,那正确的是什么呢?
在你的代码中,array
是一个列表。你不能用一个整数去和一个列表做取余运算,这样是没有意义的。所以 Python 报了一个 TypeError
错误。
你的代码看起来很奇怪,也很混乱。我觉得你可以先学习一些 Python 编程的基础知识,比如网上免费的 Learn Python the Hard Way:
http://learnpythonthehardway.org/
如果想找质数,一个不错的方法是使用埃拉托斯特尼筛法。Rosetta Code 的维基上有这个的示例代码,还有 11 种不同的用 Python 解决这个问题的方法。我觉得最简单的就是第一种,使用集合查找:
http://rosettacode.org/wiki/Sieve_of_Eratosthenes#Using_set_lookup
不过,针对你具体的问题,你可以用下面的代码来检查一个数字是否能被数组中的某个元素整除:
# see whether the number n is divisible by the number at index 3 in array
if n % array[3]:
print("True")
else:
print("False")
编辑:检查一个数字是否能被数组中的任何元素整除。
def divisible_by_any(number, lst):
for n in lst:
if number % n == 0:
return True
return False
这段代码使用取余运算来检查一个数字是否能被列表 lst
中的每个数字 n
整除。如果有任何一次检查成功,就会立即返回 True
。如果所有数字都检查完了,循环结束,就返回 False
。
在 Python 中,有一种更简洁的方法来完成上述操作,使用内置函数 any()
。
def divisible_by_any(number, lst):
return any(number % n == 0 for n in lst)
这两种方法是完全等价的,但第二种方法运行得更快,因为它使用了 Python 的内置功能 any()
。这就是学习 Python 内置的各种酷炫功能如何让你的程序写得更快,同时运行得也更快的一个例子。
这正是列表和数组之间区别的地方。在列表中,你不能把每个值和其他值进行比较,就像你不能简单地通过除以列表来对每个元素进行操作一样:
>>> list=[1,2,3,4,5,6,7,8]
>>> list==5
False
>>> list/5
Traceback (most recent call last):
File "<pyshell#18>", line 1, in <module>
list/5
TypeError: unsupported operand type(s) for /: 'list' and 'int'
而使用数组时,你可以做到这些:
>>> from numpy import array
>>> array=array([1,2,3,4,5,6,7,8])
>>> array==5
array([False, False, False, False, True, False, False, False], dtype=bool)
>>> any(array==5)
True
>>> any(array==50)
False
>>> array/5
array([0, 0, 0, 0, 1, 1, 1, 1])
你可以这样做:
any(item%i == 0 for item in array)
基本上,你是在检查你的生成器表达式中的任何一个项目是否满足你的条件。
来自Python文档:
all(iterable)
Return True if all elements of the iterable are true (or if the iterable is empty).
我对Python不够熟悉,所以不太清楚它的效率如何。为了避免测试数组中的每一个项目,你也可以尝试减少测试条件的次数。例如,下面这一行会给你一个列表,包含所有不满足条件的元素,直到第一个满足条件的元素。通过这个列表,你可以知道你的条件是否被满足(比如通过检查列表的长度),以及哪个项目满足了条件。
filtered = list(itertools.takewhile(lambda item: item%a != 0, array))
if len(filtered) != len(array):
print array[len(filtered)]
在这里,我选择在第一个满足条件的元素处停止,但可能还有其他方法!