Memisahkan integer dengan Python?

91

Masukan integer saya misalkan 12345, saya ingin membagi dan memasukkannya ke dalam array sebagai 1, 2, 3, 4, 5. Bagaimana saya bisa melakukannya?

Orang udik
sumber

Jawaban:

142
>>> [int(i) for i in str(12345)]

[1, 2, 3, 4, 5]
luc
sumber
95

mengembalikan array sebagai string

>>> list(str(12345))
['1', '2', '3', '4', '5']

mengembalikan array sebagai integer

>>> map(int,str(12345))
[1, 2, 3, 4, 5]
KAMU
sumber
25
Dalam Python3, itu akanlist(map(int,str(12345)))
Serge Stroobandt
Atau bisa juga[*map(int,str(12345))]
teepee
10
[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
nd.
sumber
Keputusan yang bagus, inilah yang akan saya tulis :)
Russell
@ dan Anda dapat meletakkan basis nomor di dalam int seperti int (i, 2) untuk biner lihat posting saya
fabrizioM
Ini adalah jawaban yang bagus, tetapi akan mendapat manfaat dari penggunaandivmod
shayaan
7

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.

Will Da Silva
sumber
3

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')
fabrizioM
sumber
Decimaltidak berguna untuk pertanyaan ini
jamylak
1

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.

jpp
sumber
0

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.

Nabeel Ahmed
sumber
0

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 :-)).

U11-Maju
sumber
0

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))]
Alexandre V.
sumber
-2

String sama dapat diulang seperti array, jadi konversikan saja menjadi string:

str(12345)
beristirahat
sumber
OP ingin int s tidak strings
jamylak
-2

Menurut jawaban sebelumnya, string bersifat iterable, jadi jika Anda membutuhkan daftar digit Anda, Anda dapat menambahkannya satu per satu menggunakan:

digits = []
digits += str(12345)
blz
sumber
Saya tidak melihat kesalahan apa pun. Satu-satunya masalah adalah bahwa hasilnya adalah daftar string, bukan daftar int.
Paul Rooney