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 3defdigits(number, base=10):assert number >= 0if number == 0:
return [0]
l = []
while number > 0:
l.append(number % base)
number = number // base
return l
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:
Sementara list(map(int, str(x)))pendekatan Pythonic, Anda dapat merumuskan logika untuk mendapatkan angka tanpa konversi jenis apa pun:
from math import log10
defdigitize(x):
n = int(log10(x))
for i inrange(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.
Menurut jawaban sebelumnya, string bersifat iterable, jadi jika Anda membutuhkan daftar digit Anda, Anda dapat menambahkannya satu per satu menggunakan:
list(map(int,str(12345)))
[*map(int,str(12345))]
[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
sumber
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.
sumber
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')
sumber
Decimal
tidak berguna untuk pertanyaan iniSementara
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.sumber
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.
sumber
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.split
adalah teman Anda, juga kami gunakanmap
ataulist comprehension
untuk mendapatkan daftar, (pisahkan apa yang kami bergabung :-)).sumber
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))]
sumber
String sama dapat diulang seperti array, jadi konversikan saja menjadi string:
str(12345)
sumber
int
s tidakstr
ingsMenurut jawaban sebelumnya, string bersifat iterable, jadi jika Anda membutuhkan daftar digit Anda, Anda dapat menambahkannya satu per satu menggunakan:
digits = [] digits += str(12345)
sumber