11

タプルを整数に変換できる関数はありますか?

例:

input = (1, 3, 7)

output = 137
4

8 に答える 8

25
>>> reduce(lambda rst, d: rst * 10 + d, (1, 2, 3))
123
于 2012-04-08T12:15:42.943 に答える
16
>>> x = (1,3,7)
>>> int(''.join(map(str,x)))
137
于 2012-04-08T12:10:40.963 に答える
4

それを文字列に変換してからintに変換するのは機能しますが、ややハックな方法です。数値を作成するために必要なすべての情報があります。つまり、次のとおりです。

  • 数字。
  • 数字の位置。

この情報があるので、各位置の各単位の値を計算し、その位置の数字を掛けて数値を計算できます。次に、結果を合計すると、番号が得られます。これは次のように 1 行で実行できます。

test = (1, 2, 3)
sum((10**pos)*val for pos, val in enumerate(reversed(test)))

これを分解してみましょう:

>>> list(enumerate(reversed(test)))
[(0, 3), (1, 2), (2, 1)]

したがって、それを掛けると、次のようになります。

>>> list((10**pos)*val for pos, val in enumerate(reversed(test)))
[3, 20, 100]

したがって、合計すると 123 になります。

編集:速度に関する注意:

python -m timeit "int(''.join(map(str,(1,2,3))))"
100000 loops, best of 3: 2.7 usec per loop

python -m timeit 'sum((10**pos)*val for pos, val in enumerate(reversed((1,2,3))))'
100000 loops, best of 3: 2.29 usec per loop

python -m timeit -s 'from functools import reduce' 'reduce(lambda rst, d: rst * 10 + d, (1, 2, 3))'
1000000 loops, best of 3: 0.598 usec per loop

あなたがスピードを上げているなら、アンドレイ・ヤズーの答えがそれを持っています. もっと読みやすいと思うものについては、私は引き裂かれています。私はいつもラムダがどうにか醜いと思いますが、一般的には、ラムダの方が読みやすい方法だと思います。

編集 2: 非常に大きなタプルの場合:

長さ 20:

python -m timeit -s "x=tuple(list(range(1,10))*2)" "int(''.join(map(str, x)))"
100000 loops, best of 3: 5.45 usec per loop

python -m timeit -s "x=tuple(list(range(1,10))*2)" "sum((10**pos)*val for pos, val in enumerate(reversed(x)))" 
100000 loops, best of 3: 11.7 usec per loop

python -m timeit -s "x=tuple(list(range(1,10))*2)" -s 'from functools import reduce' 'reduce(lambda rst, d: rst * 10 + d, x)'
100000 loops, best of 3: 4.18 usec per loop

長さ 100:

python -m timeit -s "x=tuple(list(range(1,10))*10)" "int(''.join(map(str, x)))"
100000 loops, best of 3: 18.6 usec per loop

python -m timeit -s "x=tuple(list(range(1,10))*10)" "sum((10**pos)*val for pos, val in enumerate(reversed(x)))"
10000 loops, best of 3: 72.9 usec per loop

python -m timeit -s "x=tuple(list(range(1,10))*10)" -s 'from functools import reduce' 'reduce(lambda rst, d: rst * 10 + d, x)'
10000 loops, best of 3: 25.6 usec per loop

ここで、最速の方法は実際には文字列操作であることがわかります。ただし、現実には、たとえば 10 桁の数字の範囲外でこれを使用する可能性は低いです。この場合、reduce()方法は依然として速度的に支配的です。また、文字列メソッドはハック的であり、読者にとってあまり明確ではないと主張します。これは通常、速度よりも優先されます。

于 2012-04-08T12:16:49.460 に答える
1

これは整数を文字列に変換せず、それらを連結します。

>>> sum([(10 ** i) * input[len(input)-i-1] for i in range(len(input))])
123

これは1行のforループです。

于 2012-04-08T12:18:54.170 に答える
1

どうですか:

In [19]: filter(set('0123456789').__contains__,str((1,2,3)))
Out[19]: '123'

これが最も簡単な解決策だと思います。

非常に迅速な解決策は次のとおりです。

plus=ord("0").__add__ # separate out for readability; bound functions are partially-applied functions
int(str(bytearray(map(plus,x)))) #str is necessary

それが次の最速のソリューションとどのように一致するか:

$ python -m timeit -s 'x=tuple(list(range(1,10))*10)' 'plus=ord("0").__add__;int(str(bytearray(map(plus,x))))'
10000 loops, best of 3: 47.7 usec per loop

$ python -m timeit -s "x=tuple(list(range(1,10))*10)" "int(''.join(map(str, x)))"
10000 loops, best of 3: 59 usec per loop
于 2012-04-08T13:28:34.243 に答える
1

@Marcin bytearrayソリューションは、確かに Python 2 で最速のソリューションです。

Python 3 の同じ行に従って、次のことができます。

>>> plus = ord("0").__add__
>>> int(bytes(map(plus, x)))

Python 3 は文字列とバイトを Python 2 とは異なる方法で処理するため、状況をよりよく理解するために少しタイミングを計りました。以下は、私のマシンで得た結果です。

Python 2.7 の場合 ( code ):

int(str(bytearray(map(plus, x))))           8.40 usec/pass
int(bytearray(map(plus, x)).decode())       9.85 usec/pass
int(''.join(map(str, x)))                   11.97 usec/pass
reduce(lambda rst, d: rst * 10 + d, x)      22.34 usec/pass

Python 3.2 ( code ) の場合:

int(bytes(map(plus, x)))                    7.10 usec/pass
int(bytes(map(plus, x)).decode())           7.80 usec/pass
int(bytearray(map(plus,x)).decode())        7.99 usec/pass
int(''.join(map(str, x)))                   17.46 usec/pass
reduce(lambda rst, d: rst * 10 + d, x)      19.03 usec/pass

自分で判断してください:)

于 2012-04-08T21:08:30.870 に答える
1

タプルを数値に変更する最も簡単な方法は、文字列の書式設定を使用することです。

input = (1, 3, 7)
output = int('{}{}{}'.format(input[0], input[1], input[2]))

# TEST
print(output) # 137
print(type(output)) # <class 'int'>
于 2016-05-31T15:05:05.150 に答える
0

それを行う別の方法

>>> sum(n*10**i for (i,n) in enumerate(input[::-1]))
137

そしてさらに別の

>>> int(str(input).translate(None,'(,) '))
137
于 2012-04-08T12:11:06.517 に答える