Разделите число на цифры и сохраните их в списке (массиве) с помощью python

Я хочу разделить число на цифры и сохранить их в списке (или массиве) в python. Итак, во-первых, я должен создать список, например

dig = [0 for i in range(10)]

а потом

i = 0
while num > 9:
    dig[i] = num % 10
    i += 1
    num /= 10
dig[i] = num

Но мне не очень нравится просто создавать список из 10 пробелов, можно ли получить длину числа без повторения цикла

i = 0
num2 = num
while num2 > 9:
    num2 /= 10
    i += 1
i += 1

а затем повторить первую часть кода? Или просто сделать так, как я сделал в первую очередь? Я не знаю точную длину номера, но он не будет очень длинным

Так какие советы? Может быть, вы знаете лучший способ делить числа на цифры, а может быть, что-то еще.


person Templar    schedule 18.08.2011    source источник


Ответы (3)


Поскольку вы просто добавляете цифры от наименьшего к наибольшему по порядку, просто используйте пустой список:

dig = []
i = 0
while num > 9:
    dig.append(num % 10)
    i += 1
    num /= 10
dig.append(num)

В качестве альтернативы просто сделайте

dig = list(int(d) for d in str(num))

Что превратит, т.е. 123 в '123', затем превратит каждую цифру обратно в число и поместит их в список, в результате чего получится [1, 2, 3].

Если вы хотите, чтобы это было в том же порядке, что и ваша версия, используйте

dig = reversed(int(d) for d in str(num))

Если вы действительно просто хотите получить длину числа, проще всего сделать len(str(num)), который превращает его в строку, а затем получает длину.

person agf    schedule 18.08.2011
comment
разница может и невелика, но в любом случае, если numbesr очень большие и их у вас много, какой метод оптимальнее, с циклом, модом, div или просто list(int(d) for d in str(num)? - person Templar; 19.08.2011
comment
Версия с делением в 400 раз быстрее, чем версия со строками. - person agf; 19.08.2011

Предполагая, что num является положительным целым числом, количество цифр равно int(math.log10(num) + 1).

Но лучше просто использовать метод append из list -- тогда вам не нужно будет заранее знать длину.

Еще проще (хотя список будет в обратном порядке):

dig = [int(x) for x in str(num)]

or

dig = map(int, str(num))
person Lauritz V. Thaulow    schedule 18.08.2011
comment
Хороший вопрос, я неправильно понял. Ба, вы удалили это, без комментариев для вас. - person agf; 18.08.2011

Хотя map часто называют непитоновским, эта задача определенно для него:

>>> d = 123456
>>> map(int, str(d))
[1, 2, 3, 4, 5, 6]
person Roman Bodnarchuk    schedule 18.08.2011