突破列表理解?

时间:2016-09-20 22:07:15

标签: python list-comprehension break

我接受一个整数值,找到该值的阶乘,并尝试计算尾随零的数量(如果存在)。例如:

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"在括号中是问题发生的地方。如果它遇到一个不为零的数字,我想离开循环。我试着像往常一样使用休息,然后查找一些例子,但没有发现任何相似之处。

如果有人知道如何摆脱列表理解,或者甚至可能会很好。我相信有更好的方法来解决这个问题,如果你这样做,请发帖。

4 个答案:

答案 0 :(得分: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]))

答案 1 :(得分:0)

  

如果有人知道如何摆脱列表理解

您不能破坏列表压缩。

但您可以使用if循环中的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'))

这里的想法是在末尾用字符串的长度减去的长度减去字符串的长度。

答案 2 :(得分: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)

答案 3 :(得分: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)))