Как упростить код (подсчёт цифр из которых состоит число)?

Целью задачи является выведение числа всех цифр из которого состоит число.

Возможно ли как-то упростить/сократить данный код ?

n=int(input("Введите число: "))
q0=0
q1=0
q2=0
q3=0
q4=0
q5=0
q6=0
q7=0
q8=0
q9=0
while n>0:
    f=n%10
    n=n//10
    print(n,f)
    if f==0:
        q0=q0+1
    elif f==1:
        q1=q1+1
    elif f==2:
        q2=q2+1
    elif f==3:
        q3=q3+1
    elif f==4:
        q4=q4+1
    elif f==5:
        q5=q5+1
    elif f==6:
        q6=q6+1
    elif f==7:
        q7=q7+1
    elif f==8:
        q8=q8+1
    elif f==9:
        q9=q9+1
else:
    print("Цикл окончен")
print("Итого число состоит из",q0, "нолей,",q1, "единиц,",q2, "двоек,",q3, "троек,",q4, "четверок,",q5, "пятерок,",q6, "шестерок,",q7, "семерок,",q8, "восьмерок,",q9, "девяток")

Ответы (2 шт):

Автор решения: Stanislav Volodarskiy

Переменные от q0 до q9 заменим на список из десяти элементов q:

n=int(input("Введите число: "))
q = [0] * 10
while n>0:
    f=n%10
    n=n//10
    print(n,f)
    if f==0:
        q[0]=q[0]+1
    elif f==1:
        q[1]=q[1]+1
    elif f==2:
        q[2]=q[2]+1
    elif f==3:
        q[3]=q[3]+1
    elif f==4:
        q[4]=q[4]+1
    elif f==5:
        q[5]=q[5]+1
    elif f==6:
        q[6]=q[6]+1
    elif f==7:
        q[7]=q[7]+1
    elif f==8:
        q[8]=q[8]+1
    elif f==9:
        q[9]=q[9]+1
else:
    print("Цикл окончен")
print("Итого число состоит из",q[0], "нолей,",q[1], "единиц,",q[2], "двоек,",q[3], "троек,",q[4], "четверок,",q[5], "пятерок,",q[6], "шестерок,",q[7], "семерок,",q[8], "восьмерок,",q[9], "девяток")

Выражения вида q[2]=q[2]+1 можно заменить на q[f]=q[f]+1. Во всех ветках выражение одно и то же. То есть разные ветки не нужны:

n=int(input("Введите число: "))
q = [0] * 10
while n>0:
    f=n%10
    n=n//10
    print(n,f)
    q[f]=q[f]+1
else:
    print("Цикл окончен")
print("Итого число состоит из",q[0], "нолей,",q[1], "единиц,",q[2], "двоек,",q[3], "троек,",q[4], "четверок,",q[5], "пятерок,",q[6], "шестерок,",q[7], "семерок,",q[8], "восьмерок,",q[9], "девяток")

Разбираемся с последним print. Там сложно, но можно:

n=int(input("Введите число: "))
q = [0] * 10
while n>0:
    f=n%10
    n=n//10
    print(n,f)
    q[f]=q[f]+1
else:
    print("Цикл окончен")

names = [
    "нолей,", "единиц,", "двоек,", "троек,", "четверок,",
    "пятерок,", "шестерок,", "семерок,", "восьмерок,", "девяток"
]
print("Итого число состоит из", end=" ")
for i in range(10):
    print(q[i], names[i], end=" ")
print()

Я бы убрал нули из печати и причесал бы код:

n = int(input("Введите число: "))
q = [0] * 10
while n > 0:
    n, f = divmod(n, 10)
    q[f] += 1

names = [
    "нолей", "единиц", "двоек", "троек", "четверок",
    "пятерок", "шестерок", "семерок", "восьмерок", "девяток"
]
parts = []
for d, n in zip(q, names):
    if d > 0:
        parts.append(f"{d} {n}")
print("Итого число состоит из", ", ".join(parts))

Само число не нужно, проще работать со строкой-изображением числа:

import collections

c = collections.Counter(input("Введите число: "))

names = [
    "нолей", "единиц", "двоек", "троек", "четверок",
    "пятерок", "шестерок", "семерок", "восьмерок", "девяток"
]
parts = []
for i, n in enumerate(names):
    q = c[str(i)]
    if q > 0:
        parts.append(f"{q} {n}")
print("Итого число состоит из", ", ".join(parts))

Осталось сделать склонения, "1 единиц" выглядит плохо.

→ Ссылка
Автор решения: AnnaBazueva

Решение со склонением и игнорированием цифр отсутствующих в числе:

_, __, ___ = (1,), (2, 3, 4), (5, 6, 7, 8, 9, 0)

d = {"0": {_: "ноль", __: "ноля", ___: "нолей"},
     "1": {_: "единица", __: "единицы", ___: "единиц"},
     "2": {_: "двойка", __: "двойки", ___: "двоек"},
     "3": {_: "тройка", __: "тройки", ___: "троек"},
     "4": {_: "четвёрка", __: "четвёрки", ___: "четвёрок"},
     "5": {_: "пятёрка", __: "пятёрки", ___: "пятёрок"},
     "6": {_: "шестёрка", __: "шестёрки", ___: "шестёрок"},
     "7": {_: "семёрка", __: "семёрки", ___: "семёрок"},
     "8": {_: "восьмёрка", __: "восьмёрки", ___: "восьмёрок"},
     "9": {_: "девятка", __: "девятки", ___: "девяток"}
     }

f = lambda c, v: (v[_] if c % 10 in _ and (c == 1
                                           or
                                           (c > 11 and str(c)[-2:] != "11")
                                           )
                  else v[__] if c % 10 in __ and (c < 5 or c > 15)
                  else v[___]
                  )

n = input("Введите число: ")

prep = (f'{(c := n.count(k))} {f(c,v)}' for k, v in d.items())

print("Число состоит из:\n    "
      f"{',\n    '.join((p for p in prep if "0" not in p))}."
      )

output:

Введите число: 01234545599999
Число состоит из:
    1 ноль,
    1 единица,
    1 двойка,
    1 тройка,
    2 четвёрки,
    3 пятёрки,
    5 девяток.
→ Ссылка