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
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
>>> x = (1,3,7)
>>> int(''.join(map(str,x)))
137
Tôi ghét điều kiện chủng tộc :-) – Abhijit
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
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. –
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
Có thể tốt hơn: 'đảo ngược (đầu vào)' thay vì 'đầu vào [:: - 1]'. – rubik
>>> reduce(lambda rst, d: rst * 10 + d, (1, 2, 3))
123
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à:
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 độ.
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.
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
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
@ 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
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. –
@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 :)
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'>
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. –