Tách số nguyên trong Python?


87

Đầ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:


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

[1, 2, 3, 4, 5]

91

trả về mảng dưới dạng chuỗi

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

trả về mảng dưới dạng số nguyên

>>> map(int,str(12345))
[1, 2, 3, 4, 5]

24
Trong Python3, điều đó sẽ làlist(map(int,str(12345)))
Serge Stroobandt,

10
[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

Tốt gọi, đây là những gì tôi sắp viết :)
Russell

@ và bạn có thể đặt cơ số của số bên trong int như int (i, 2) cho hệ nhị phân, hãy xem bài đăng của tôi
fabrizioM 15/12/09

Đây là một câu trả lời tốt, nhưng sẽ được hưởng lợi từ việc sử dụngdivmod
Shayaan

6

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.


3

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
jamylak

1

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.


0

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.


0

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


0

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))]

-2

Chuỗi cũng có thể lặp lại như mảng, vì vậy chỉ cần chuyển đổi nó thành chuỗi:

str(12345)

OP mong muốn intcủa không strsợ hãi
jamylak

-2

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)

Tôi không thấy bất kỳ lỗi nào. Vấn đề duy nhất là kết quả là một danh sách các chuỗi, không phải là một danh sách các int.
Paul Rooney
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.