Python - 检查列表中的数字是否是某个数的因子
我有一个数字列表(整数),比如说从1到10。
这些数字不一定是连续的,但它们是按从小到大的顺序排列的。
我让用户多次输入可用的数字选择。当用户输入一个数字后,这个数字会从列表中删除,同时它的所有因子也会被删除。
我已经阻止用户选择质数(只能被1和它自己整除的数字)。不过,有时候列表中可能会有非质数,但它们没有剩下的因子。
我对Python还比较陌生,所以在实现以下功能时遇到了一些困难:
检查用户选择的数字是否没有剩下的因子(即使它不是质数)。
检查列表中是否只剩下质数,或者没有因子的数字。
我在考虑使用for
循环,但不太确定该怎么实现。有没有人能给我一些建议或代码?提前谢谢大家...
3 个回答
如果L是一个包含非零数字的列表,那么那些是数字N的因子的列表就是:
factors = [x for x in L if N % x == 0]
当然,如果N在L中没有因子,这个列表就会是空的。
我不太明白你说的“没有因子的数字”是什么意思,除非你是指“质数”(?)- 其实在StackOverflow上有很多关于如何检查一个数字是否是质数的问题和答案,我会使用gmpy.is_prime
(来自我的扩展gmpy),不过这当然是我个人的偏好;-)。
如果你的意思是“所有在L中没有因子的数字”,那么这样的数字是无穷无尽的,所以列出所有这些数字有点困难。这里有一个可以生成这些数字的无限生成器:
import itertools
def nofactorsinlist(L):
for i in itertools.count():
if any(x for x in L if i % x == 0):
continue
yield i
虽然可以进行一些优化,但这个方法真的很简单,我不太想在不完全理解你想要什么的情况下添加复杂的优化!-)
对于第一个问题,你可以使用列表推导式来创建一个新列表,这个列表里的每个元素都不是你选择的那个数字,也不是选择的数字的因子(可以参考代码)。然后把这个新列表和你原来的列表进行比较。
$ python
>>> selected_number = 6
>>> [x for x in range(1,11) if selected_number % x]
[4, 5, 7, 8, 9, 10]
对于第二个问题,检查每个元素是否是质数。如果不是,就检查这些数字有没有因子;对于每个元素,你可以用mod
运算去对原始列表进行检查,看看结果是不是全零的列表。不过,我相信还有更快的方法。