count len 行列 - Pythonの整数の長さ





7 Answers

文字列への変換なし

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
文字列 エラー 配列

Pythonでは、整数の桁数はどうやって調べるのですか?




Python 2.* intは、Pythonビルドに応じて、4バイトまたは8バイト(32または64ビット)のいずれかをとります。 sys.maxint (32ビットintの場合は2**63-1 sys.maxintビットintの場合は2**63-1 )は、どちらの可能性が得られるかを示します。

Python 3では、 int s(Python 2のlong sのような)は、使用可能なメモリ量まで任意のサイズを取ることができます。 sys.getsizeofは、一定のオーバーヘッドを数えますが、任意の値に対して適切な表示を行います。

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

他の答えが示唆しているように、整数値の文字列表現を考えているなら、その表現のlenをそのまま10 lenで使うか、そうでなければならないのですか?




文字列に変換せずに、私は次のようにします:

def lenDigits(x): 
    """
    Assumes int(x)
    """

    x = abs(x)

    if x < 10:
        return 1

    return 1 + lenDigits(x / 10)

最小限の再帰FTW




後世にとって、この問題の最も遅い解決策は間違いないでしょう:

def num_digits(num, number_of_calls=1):
    "Returns the number of digits of an integer num."
    if num == 0 or num == -1:
        return 1 if number_of_calls == 1 else 0
    else:
        return 1 + num_digits(num/10, number_of_calls+1)



整数で格納できる最大の数を求めていると仮定すると、その値は実装に依存します。 私はあなたがPythonを使用するときにそのように考えることはお勧めしません。 いずれにしても、かなり大きな値をPythonの「整数」に格納することができます。 覚えておいて、Pythonはダックタイピングを使用しています。

編集:質問者が数字の桁数を求めていることを明確にする前に私は答えを出しました。 そのために、私は受け入れられた答えによって提案された方法に同意します。 何も追加する必要はありません!




以下の方法を使用すると、整数に対して素早く行うことができます。

len(str(abs(1234567890)))

"1234567890"の絶対値の文字列の長さを取得します。

absは数値を除いた数値を返し、 strはそれをstrキャスト/変換し、 lenはその文字列の文字列長を返します。

浮動小数点数を使用する場合は、次のいずれかを使用できます。

# Ignore all after decimal place
len(str(abs(0.1234567890)).split(".")[0])

# Ignore just the decimal place
len(str(abs(0.1234567890)))-1

今後の参考のために。




整数を文字列に変換せずに桁数を数える:

x=123
x=abs(x)
i = 0
while x >= 10**i:
    i +=1
# i is the number of digits



Related