2012-04-08 48 views
11

Có chức năng nào có thể chuyển đổi một bộ thành một số nguyên không?Python chuyển đổi Tuple thành Số nguyên

Ví dụ:

input = (1, 3, 7) 

output = 137 
+1

Tuple của bạn chỉ có một số nguyên? Bạn có kế hoạch các bộ dữ liệu hanle như 'x = (1, 9, 10, 150)' không? Nếu có, bạn có thể xác định đầu ra nào nên có? Vui lòng cung cấp thêm thông tin. –

Trả lời

13
>>> x = (1,3,7) 
>>> int(''.join(map(str,x))) 
137 
+1

Tôi ghét điều kiện chủng tộc :-) – Abhijit

+0

hehehehe ... đã xảy ra với tôi bài cuối cùng, ngoại trừ tôi bị downvoted vì họ nghĩ tôi đã sao chép ... – jamylak

+0

Giải pháp này là giải pháp duy nhất cho đến nay cũng có thể xử lý 'x = (1, 9, 10, 15) '. Nó không rõ ràng nếu OP muốn xử lý chúng quá hay không. –

0

Chỉ cần một cách khác để làm điều đó

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

nhưng khác

>>> int(str(input).translate(None,'(,) ')) 
137 
+0

Có thể tốt hơn: 'đảo ngược (đầu vào)' thay vì 'đầu vào [:: - 1]'. – rubik

24
>>> reduce(lambda rst, d: rst * 10 + d, (1, 2, 3)) 
123 
+3

Thanh lịch nhất trong số 5 câu trả lời IMO .. – 0xc0de

+0

+1 Wow, vâng tôi đồng ý ... 'reduce' ở mức tốt nhất: D – jamylak

+1

Điều đáng chú ý trong Python 3.x,' 'reduce()' 'là [' ' functools.reduce() ''] (http://docs.python.org/py3k/library/functools.html?highlight=reduce#functools.reduce). –

4

Trong khi chuyển đổi nó thành một chuỗi sau đó đến một công trình int, đó là một phương pháp hơi hackish. Chúng tôi có tất cả thông tin chúng tôi cần để tạo số, cụ thể là:

  • Các chữ số.
  • Vị trí của các chữ số.

Khi có thông tin này, chúng tôi có thể tính số bằng cách tính giá trị của mỗi đơn vị tại mỗi vị trí, sau đó nhân số đó với chữ số ở vị trí đã nói. Sau đó, chúng tôi cộng các kết quả và chúng tôi có số của chúng tôi. Điều này có thể được thực hiện trong một dòng như vậy:

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

Hãy phá vỡ này xuống:

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

Vì vậy, sau đó, nếu chúng ta nhân nó lên:

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

Vì vậy, chúng tôi chỉ tổng hợp để nhận 123.

Chỉnh sửa: Ghi chú về tốc độ:

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 

Vì vậy, nếu bạn đang đi vào tốc độ, Andrey Yazu's answer có nó. Tôi bị rách như những gì tôi cảm thấy là dễ đọc hơn. Tôi luôn luôn tìm thấy lambdas xấu xí bằng cách nào đó, nhưng nói chung, tôi nghĩ rằng nó vẫn là phương pháp dễ đọc hơn.

Chỉnh sửa 2: Với các bộ rất lớn:

Chiều dài 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 

Chiều dài 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 

đây chúng ta thấy rằng phương pháp nhanh nhất thực sự là hoạt động chuỗi - tuy nhiên , thực tế là bạn không có khả năng sử dụng điều này bên ngoài phạm vi, ví dụ, 10 chữ số - nơi phương pháp reduce() vẫn thống trị tốc độ. Tôi cũng sẽ lập luận rằng phương pháp chuỗi là hackish và ít rõ ràng hơn cho người đọc, mà thường sẽ là ưu tiên hơn tốc độ.

+0

Tôi vừa mới đăng bài 'tổng (10 ** i * x cho i, x trong liệt kê (x [:: - 1]))' nhưng bây giờ tôi sẽ không haha ​​ – jamylak

+0

Câu trả lời này không giống với tôi? – Abhijit

+0

Có vẻ như vậy ... – jamylak

1

này không chuyển đổi các số nguyên thành các chuỗi và concats họ:

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

đây là một cho vòng lặp trong một dòng.

1

Làm thế nào về:

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

Tôi tin rằng đây là giải pháp đơn giản nhất.

Một giải pháp rất nhanh là:

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

Làm thế nào mà ngăn xếp lên chống lại các giải pháp tiếp theo nhanh nhất:

$ 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 
+0

sử dụng '__functions__' không phải là một ý tưởng hay, đặc biệt khi có các tùy chọn khác, đúng không? – 0xc0de

+0

@ 0xc0de Tại sao không? 'str' sẽ không bao giờ mất phương thức' __contains__', và điều này tránh được cả hàm gọi hàm (python) và các chi phí phân giải của toán tử. – Marcin

+0

Lưu ý rằng trong Python 3.x, ví dụ đầu tiên của bạn trả về '' ['1', '2', '3'] '', không phải '' '123''' và đầu ra được yêu cầu theo cách là int - không phải là một chuỗi. –

1

@Marcinbytearray giải pháp thực sự là nhanh nhất một bằng Python 2.

Theo cùng một dòng trong Python 3 người ta có thể làm:

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

Python 3 xử lý chuỗi và byte theo cách khác với Python 2, vì vậy để hiểu rõ hơn tình hình tôi đã thực hiện một chút thời gian. Sau đây là kết quả tôi nhận được trên máy tính của mình.

Với 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 

Trong khi với 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 

Thẩm phán bởi mình :)

1

Phương pháp đơn giản nhất để thay đổi một tuple vào một số là sử dụng chuỗi định dạng.

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

# TEST 
print(output) # 137 
print(type(output)) # <class 'int'> 
Các vấn đề liên quan