Длина целого числа в Python

В Python, как Вы находите количество цифр в целом числе?

203
задан Peter Mortensen 2 September 2016 в 08:40
поделиться

6 ответов

Если вам нужна длина целого числа, равная количеству цифр целого числа, вы всегда можете преобразовать его в строку, например str (133) , и найти ее длину, например len (str (123)) .

270
ответ дан 23 November 2019 в 04:56
поделиться

Вы можете сравнить вашу коллекцию с упорядоченной версией:

CollectionAssert.AreEqual(foos.ToList(), foos.OrderBy(f => f.Id));

Или:

CollectionAssert.AreEqual(foos.ToList(), 
                          foos.OrderByDescending(f => f.DateCreated));
-121--4950603-

Без преобразования в строку

import math
digits = int(math.log10(n))+1

Для обработки нулевых и отрицательных чисел

import math
if n > 0:
    digits = int(math.log10(n))+1
elif n == 0:
    digits = 1
else:
    digits = int(math.log10(-n))+2 # +1 if you don't count the '-' 

Вы, вероятно, захотите поместить это в функцию:)

Вот некоторые тесты. len (str ()) уже позади даже для довольно небольших чисел

timeit math.log10(2**8)
1000000 loops, best of 3: 746 ns per loop
timeit len(str(2**8))
1000000 loops, best of 3: 1.1 µs per loop

timeit math.log10(2**100)
1000000 loops, best of 3: 775 ns per loop
 timeit len(str(2**100))
100000 loops, best of 3: 3.2 µs per loop

timeit math.log10(2**10000)
1000000 loops, best of 3: 844 ns per loop
timeit len(str(2**10000))
100 loops, best of 3: 10.3 ms per loop
-121--627364-

Python 2. * int s принимают либо 4, либо 8 байт (32 или 64 бит), в зависимости от вашей сборки Python. sys.maxint ( 2 * * 31-1 для 32-разрядных int, 2 * * 63-1 для 64-разрядных int) сообщит, какую из двух возможностей можно получить.

В Python 3 int s (как long s в Python 2) могут принимать произвольные размеры вплоть до объема доступной памяти; sys.getsizeof дает вам хорошую индикацию для любого заданного значения, хотя также подсчитывает некоторые фиксированные издержки:

>>> import sys
>>> sys.getsizeof(0)
12
>>> sys.getsizeof(2**99)
28

Если, как показывают другие ответы, вы думаете о некотором строковом представлении целого значения, то просто возьмите len этого представления, будь то в базовой 10 или иначе!

22
ответ дан 23 November 2019 в 04:56
поделиться

Предполагая, что вы запрашиваете наибольшее число, которое вы можете сохранить в виде целого числа, значение зависит от реализации. Я предлагаю вам не думать таким образом при использовании python. В любом случае довольно большое значение может быть сохранено в "целочисленном" Python. Помните, Python использует утиную печать!

Изменить: Я дал свой ответ до пояснения, что спрашивающий хотел количество цифр. Для этого я согласен с методом, предложенным в принятом ответе. Больше нечего добавить!

1
ответ дан 23 November 2019 в 04:56
поделиться
>>> a=12345
>>> a.__str__().__len__()
5
.
-12
ответ дан 23 November 2019 в 04:56
поделиться

Без преобразования в строку

import math
digits = int(math.log10(n))+1

Чтобы также обрабатывать нулевые и отрицательные числа

import math
if n > 0:
    digits = int(math.log10(n))+1
elif n == 0:
    digits = 1
else:
    digits = int(math.log10(-n))+2 # +1 if you don't count the '-' 

Вам, наверное, захочется поместить это в функцию :)

Вот несколько бенчмарков. len(str()) уже отстает даже для совсем маленьких чисел

timeit math.log10(2**8)
1000000 loops, best of 3: 746 ns per loop
timeit len(str(2**8))
1000000 loops, best of 3: 1.1 µs per loop

timeit math.log10(2**100)
1000000 loops, best of 3: 775 ns per loop
 timeit len(str(2**100))
100000 loops, best of 3: 3.2 µs per loop

timeit math.log10(2**10000)
1000000 loops, best of 3: 844 ns per loop
timeit len(str(2**10000))
100 loops, best of 3: 10.3 ms per loop
216
ответ дан 23 November 2019 в 04:56
поделиться
from math import log10
digits = lambda n: ((n==0) and 1) or int(log10(abs(n)))+1
2
ответ дан 23 November 2019 в 04:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: