Đầu vào số nguyên của tôi là giả sử 12345, tôi muốn tách và đặt nó vào một mảng dưới dạng 1, 2, 3, 4, 5. Làm thế nào tôi có thể làm điều đó?
Câu trả lời:
[int(i) for i in str(number)]
hoặc, nếu không muốn sử dụng khả năng hiểu danh sách hoặc bạn muốn sử dụng cơ sở khác với 10
from __future__ import division # for compatibility of // between Python 2 and 3
def digits(number, base=10):
assert number >= 0
if number == 0:
return [0]
l = []
while number > 0:
l.append(number % base)
number = number // base
return l
divmod
Tôi không muốn biến một số nguyên thành một chuỗi, vì vậy đây là hàm tôi sử dụng cho việc này:
def digitize(n, base=10):
if n == 0:
yield 0
while n:
n, d = divmod(n, base)
yield d
Ví dụ:
tuple(digitize(123456789)) == (9, 8, 7, 6, 5, 4, 3, 2, 1)
tuple(digitize(0b1101110, 2)) == (0, 1, 1, 1, 0, 1, 1)
tuple(digitize(0x123456789ABCDEF, 16)) == (15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
Như bạn có thể thấy, điều này sẽ mang lại các chữ số từ phải sang trái. Nếu bạn muốn các chữ số từ trái sang phải, bạn sẽ cần tạo một chuỗi từ đó, sau đó đảo ngược nó:
reversed(tuple(digitize(x)))
Bạn cũng có thể sử dụng hàm này để chuyển đổi cơ sở khi bạn tách số nguyên. Ví dụ sau đây chia một số thập lục phân thành các nibbles nhị phân dưới dạng các bộ giá trị:
import itertools as it
tuple(it.zip_longest(*[digitize(0x123456789ABCDEF, 2)]*4, fillvalue=0)) == ((1, 1, 1, 1), (0, 1, 1, 1), (1, 0, 1, 1), (0, 0, 1, 1), (1, 1, 0, 1), (0, 1, 0, 1), (1, 0, 0, 1), (0, 0, 0, 1), (1, 1, 1, 0), (0, 1, 1, 0), (1, 0, 1, 0), (0, 0, 1, 0), (1, 1, 0, 0), (0, 1, 0, 0), (1, 0, 0, 0))
Lưu ý rằng phương pháp này không xử lý số thập phân, nhưng có thể được điều chỉnh cho.
như @nd nói nhưng sử dụng hàm tích hợp sẵn của int để chuyển đổi sang một cơ sở khác
>>> [ int(i,16) for i in '0123456789ABCDEF' ]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
>>> [int(i,2) for i in "100 010 110 111".split()]
[4, 2, 6, 7]
Tôi không biết mục tiêu cuối cùng là gì nhưng hãy xem bên trong mô-đun thập phân của python để thực hiện những việc như
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
Decimallà vô ích cho câu hỏi này
Mặc dù list(map(int, str(x)))là phương pháp Pythonic, bạn có thể hình thành logic để lấy ra các chữ số mà không cần chuyển đổi kiểu:
from math import log10
def digitize(x):
n = int(log10(x))
for i in range(n, -1, -1):
factor = 10**i
k = x // factor
yield k
x -= k * factor
res = list(digitize(5243))
[5, 2, 4, 3]
Một lợi ích của một máy phát điện là bạn có thể ăn liên tục đến set, tuple, next, vv, mà không cần bất kỳ logic bổ sung.
Tách một số thành các chữ số (như đã trả lời cho tất cả):
>>> [int(i) for i in str(12345)]
[1, 2, 3, 4, 5]
Tuy nhiên, để lấy các chữ số từ danh sách các số:
>>> [int(d) for d in ''.join(str(x) for x in [12, 34, 5])]
[1, 2, 3, 4, 5]
Vì vậy, muốn biết, nếu chúng ta có thể làm những điều trên, hiệu quả hơn.
Có thể join+ split:
>>> a=12345
>>> list(map(int,' '.join(str(a)).split()))
[1, 2, 3, 4, 5]
>>> [int(i) for i in ' '.join(str(a)).split()]
[1, 2, 3, 4, 5]
>>>
str.join+ str.splitlà bạn của bạn, chúng tôi cũng sử dụng maphoặc list comprehensionđể lấy danh sách, (chia nhỏ những gì chúng tôi tham gia :-)).
Một giải pháp khác không liên quan đến chuyển đổi thành / từ chuỗi:
from math import log10
def decompose(n):
if n == 0:
return [0]
b = int(log10(n)) + 1
return [(n // (10 ** i)) % 10 for i in reversed(range(b))]
theo các câu trả lời trước, các chuỗi có thể lặp lại, vì vậy nếu bạn cần danh sách các chữ số của mình, bạn có thể nối từng chữ số một bằng cách sử dụng:
digits = []
digits += str(12345)
list(map(int,str(12345)))