Masukan integer saya misalkan 12345, saya ingin membagi dan memasukkannya ke dalam array sebagai 1, 2, 3, 4, 5. Bagaimana saya bisa melakukannya?
Masukan integer saya misalkan 12345, saya ingin membagi dan memasukkannya ke dalam array sebagai 1, 2, 3, 4, 5. Bagaimana saya bisa melakukannya?
Jawaban:
[int(i) for i in str(number)]
atau, jika tidak ingin menggunakan pemahaman daftar atau Anda ingin menggunakan basis yang berbeda dari 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
Saya lebih suka tidak mengubah integer menjadi string, jadi inilah fungsi yang saya gunakan untuk ini:
def digitize(n, base=10):
if n == 0:
yield 0
while n:
n, d = divmod(n, base)
yield d
Contoh:
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)
Seperti yang Anda lihat, ini akan menghasilkan angka dari kanan ke kiri. Jika Anda ingin digitnya dari kiri ke kanan, Anda harus membuat urutan darinya, lalu membalikkannya:
reversed(tuple(digitize(x)))
Anda juga dapat menggunakan fungsi ini untuk konversi dasar saat Anda memisahkan bilangan bulat. Contoh berikut membagi bilangan heksadesimal menjadi camilan biner sebagai tupel:
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))
Perhatikan bahwa metode ini tidak menangani desimal, tetapi dapat disesuaikan.
seperti @nd mengatakan tetapi menggunakan fungsi built-in int untuk mengonversi ke basis yang berbeda
>>> [ 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]
Saya tidak tahu apa tujuan akhirnya tetapi lihat juga di dalam modul desimal python untuk melakukan hal-hal seperti
>>> Decimal('3.1415926535') + Decimal('2.7182818285')
Decimal('5.85987')
Decimaltidak berguna untuk pertanyaan ini
Sementara list(map(int, str(x)))pendekatan Pythonic, Anda dapat merumuskan logika untuk mendapatkan angka tanpa konversi jenis apa pun:
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]
Salah satu manfaat dari generator adalah Anda dapat memberi makan mulus untuk set, tuple, next, dll, tanpa logika tambahan.
Memisahkan satu nomor menjadi digitnya (seperti yang dijawab oleh semua):
>>> [int(i) for i in str(12345)]
[1, 2, 3, 4, 5]
Tapi, untuk mendapatkan angka dari daftar angka:
>>> [int(d) for d in ''.join(str(x) for x in [12, 34, 5])]
[1, 2, 3, 4, 5]
Jadi ingin tahu, jika kita bisa melakukan hal di atas, lebih efisien.
Mungkin 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.splitadalah teman Anda, juga kami gunakan mapatau list comprehensionuntuk mendapatkan daftar, (pisahkan apa yang kami bergabung :-)).
Solusi lain yang tidak melibatkan konversi ke / dari string:
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))]
String sama dapat diulang seperti array, jadi konversikan saja menjadi string:
str(12345)
int s tidak strings
Menurut jawaban sebelumnya, string bersifat iterable, jadi jika Anda membutuhkan daftar digit Anda, Anda dapat menambahkannya satu per satu menggunakan:
digits = []
digits += str(12345)
list(map(int,str(12345)))