2016-09-20 56 views
0

我正在采取一个整数值,找到该值的阶乘,并试图计算尾随零的数量(如果存在的话)。例如:突破列表理解?

def zeros(n): 
    import math 
    factorial = str(math.factorial(n)) 
    zeros_lst = [number if number == "0" (else) for number in factorial[::-1]] 
    return len(zeros_lst) 

括号中的“else”是发生问题的位置。如果遇到不为零的数字,我想离开循环。我尝试像平时一样使用break,然后查找一些例子,但没有发现任何相似之处。

如果有人知道如何从列表理解中突破,或者如果甚至可能会很好。我相信有更好的方法可以解决这个问题,如果你这样做,请张贴。

+0

请修复您的代码格式。 – albert

+3

列表解析并不真正支持中断的概念...只需使用标准的'for'循环... – ig0774

+1

您可以像'itertools.takewhile'那样使用生成器表达式 - 但正如@ ig0774所述,你可能更喜欢香草循环。 – mgilson

回答

0

在列表解析中没有“突破”,但还有其他一些技巧,例如, itertools.takewhile当条件满足它迭代一个可迭代:

>>> from itertools import takewhile 
>>> 
>>> values = [7, 9, 11, 4, 2, 78, 9] 
>>> list(takewhile(lambda x: x > 5, values)) 
[7, 9, 11] 

在你的情况(我想退出循环,如果一旦遇到了一些不为零):

zeros_lst = list(takewhile(lambda x: x=="0", factorial[::-1])) 
+0

是不是要求尾随零?有'takeuntil'吗?或'lambda x:x!='0''? –

+0

@ joelgoldstick啊,是的,'factorial [:: - 1]',我会更新答案。说实话,我不明白OP的真实意图。 – zvone

+1

如果你不介意变得更加模糊,你可以使用''0“.__ eq__'而不是'lambda'函数。 – Blckknght

0

如果有人知道如何从一个列表理解

你不能打破一个列表压缩打破。

但是,您可以使用for循环中的if条件修改列表理解。随着如果,你可以决定需要什么样的价值观是列表的一部分:

def zeros(n): 
    import math 
    factorial = str(math.factorial(n)) 
    # Check this line 
    zeros_lst = [number for number in factorial[::-1] if number == '0'] 
    return len(zeros_lst) 

这是更好地使用简单的for循环。事实上,就性能而言,循环比列表理解要快。检查HERE我做了另一个问题的比较。

即使列表理解应该是首选,因为它们是干净的,更具可读性。再次,这是基于意见:可读性V/S速度。

建议

此外,还有一个更简单的方法来实现你通过做什么:

import math 
def find_zeros_in_factorial(n): 
    num_str = str(math.factorial(n)) 
    return len(num_str)-len(num_str.rstrip('0')) 

这里的想法是要减去字符串的长度字符串的长度最后没有零

0

有一个更加数学的方法来解决这个问题,它非常简单,易于实现。我们只需要计算十个因子(n)中有多少个因子。我们有超过2的因素,所以我们选择计算5的因子。它看起来并不干净,但它避免了因子的计算。该算法解决了5个额外的因素,如25,50和125等数字。

def find_zeros_in_factorial(n): 
    factors_of_5 = [n/5] 
    while factors_of_5[-1] > 0: 
     factors_of_5.append(factors_of_5[-1]/5) 
    return sum(factors_of_5) 
+0

嘿所以我需要一些帮助来理解你的代码。我不明白你的while循环用英语说什么。你为什么使用[-1]?谢谢你的时间。 – eeskonivich

+0

在Python中,有一种方便的方法来获取数组的最后一个元素。你所要做的就是在数组上使用索引-1并返回数组的最后一个元素。因此,对于上面的while语句中的每个循环来说,它将检查最后一个元素是否大于0.如果是,则它将数组的最后一个元素除以5,然后将结果追加到阵列。 –

+0

感谢您的澄清。我应该知道你正在拼接到这个列表中,只是想着。 – eeskonivich

0

这里是一个函数,将计算零,你只需要传递它的数字。这可以节省你以前的字符串操作。一旦没有更多尾随零,它将终止。

def count_zeros(n): 
    n_zeros = 0; 
    while True: 
     if n%10 == 0: 
      n = n/10 
      n_zeros+=1 
     else: 
      return n_zeros 

print(count_zeros(math.factorial(12)))