Эффективно удалить все, кроме повторяющихся конечных символов - PullRequest
0 голосов
/ 05 марта 2019

Какой эффективный способ просто оставить повторяющиеся конечные символы в заданном числе?(как перевернутая полоса) (я не смог найти быстрый метод)

Например number='184950273400000' print((number).strip('0')) Результат - 1849502734

Но мне было интересно, как вместо чередования нулей эффективно убратьвсе до 0.Таким образом, результат будет 00000.

И в этом случае len(number) будет == 5

Мне было интересно, было ли что-то вроде перевернутой полосы, потому что я пытаюсь найти длину повторенияконечные числа.

Ответы [ 5 ]

0 голосов
/ 05 марта 2019

Если вы хотите обработать его из строки (вместо математического подхода), вы, вероятно, получите лучшую производительность, используя только итераторы:

from itertools import takewhile
countTrailingZeroes = sum( 1 for _ in takewhile(lambda c:c=="0",reversed(number)) )
0 голосов
/ 05 марта 2019

Если вы хотите найти число конечных нулей факториала, как предлагается в комментариях, не всегда возможно вычислить факториал, чтобы использовать другие предложенные методы.Вместо этого вам нужно только вычислить факторы 5, которые входят в число.Это не будет быстрее, чем другие методы, если число уже предоставлено, но намного быстрее, чем вычисление факториала.

def count_zero(n):
    return sum([n//5**(i+1) for i in range(int(math.log(n, 5)))])
0 голосов
/ 05 марта 2019

Вот вариант перформанта.Требуется только сканирование последних цифр.

def count_zeros(number):

    number=str(number)
    i=0
    for digit in reversed(number): #count backwards
        if digit!=number[-1]:
            return i
        else:
            i+=1
0 голосов
/ 05 марта 2019

Вы можете использовать функцию reversed для эффективной генерации строки как последовательности в обратном порядке, так что вы можете использовать itertools.takewhile для вывода только начальных символов, которые равны '0' с '0' 's.Метод равенства, а затем соедините символы для вывода:

from itertools import takewhile
''.join(takewhile('0'.__eq__, reversed(number)))

Это позволяет избежать итерации по любой (потенциально очень длинной) части строки, ведущей к конечным нулям.

0 голосов
/ 05 марта 2019

Вы можете использовать регулярное выражение:

import re

number='184950273400000'

re.search(r'0+$', number).group(0)
# 00000

Вы также можете использовать функцию takewhile() с обратной строкой:

from itertools import takewhile

''.join(takewhile(lambda x: x == '0', number[::-1]))
# 00000

Наконец, вы можете использовать длину вырезанной строки:

number[len(number.rstrip('0')):]
# 00000
...