如何用列表推导式替代循环中的extend?将Python求约数代码改为一行
当然可以,这里给你两种用列表推导式(结合或不结合itertools.chain)的改写方式,都能把原逻辑压缩成一行函数体:
方式1:嵌套列表推导式
from math import sqrt def divisors(n): return list(set(item for div in range(1, int(sqrt(n)) + 1) if n % div == 0 for item in [div, n // div]))
这里用双层循环的列表推导式替代extend:外层遍历可能的约数div并判断整除条件,内层遍历[div, n//div]把两个元素逐个生成,最后通过集合去重再转回列表,和原逻辑完全一致。
方式2:结合itertools.chain
from math import sqrt from itertools import chain def divisors(n): return list(set(chain.from_iterable([div, n//div] for div in range(1, int(sqrt(n)) + 1) if n % div == 0)))
这种方式用chain.from_iterable把每个符合条件的[div, n//div]小列表拼接成一个连续的迭代器,再去重转列表,和你尝试的思路匹配。
另外建议把原代码里的n / div改成n // div,确保得到整数类型的约数,避免出现浮点数(比如当n是完全平方数时,虽然集合去重不受影响,但整数更符合约数的定义)。
内容的提问来源于stack exchange,提问作者Ashtart
相关产品推荐
相关产品推荐

