У программистов особые отношения с двоичной системой счисления.
Продолжим тренировки в статистической обработке данных и проанализируем данные числа.
Напишите программу, которая для переданных чисел вычисляет:
- количество разрядов;
- количество единиц;
- количество нулей.
Формат ввода
Вводится последовательность чисел, записанных через пробел.
Формат вывода:
Вывести список словарей с требуемой статистикой.
Примечание
Вывод в примерах отформатирован только для визуальной наглядности.
Все пробельные символы при проверке игнорируются.
Порядок словарей обязан совпадать с порядком переданных чисел.
Порядок ключей в словаре не имеет значения.
Пример
Ввод
5 8 12
Вывод
[
{
"digits": 3,
"units": 2,
"zeros": 1
},
{
"digits": 4,
"units": 1,
"zeros": 3
},
{
"digits": 4,
"units": 2,
"zeros": 2
}
]
Ввод
13 2 7
Вывод
[
{
"digits": 4,
"units": 3,
"zeros": 1
},
{
"digits": 2,
"units": 1,
"zeros": 1
},
{
"digits": 3,
"units": 3,
"zeros": 0
}
]
Решение
Считываем строку и разбиваем ее на числа (токены).
С помощью знаний полученных из задания T. Математическая выгода переводим число в двоичную систему счисления.
Считаем получившиеся единицы и нули и увеличиваем счетчик в словаре.
По окончании перевода, заполняем поле количество цифр, записав туда сумму полученных нулей и единиц. Добавляем словарик в список.
По окончании цикла выводим словарь без форматирования.
Посмотреть код
Решение
numbers = input().split()
total = []
result = dict()
for item in numbers:
units = zeros = 0
number = int(item)
while number > 0:
if number % 2:
units += 1
else:
zeros += 1
number = number // 2
result['digits'] = zeros + units
result['units'] = units
result['zeros'] = zeros
total.append(result.copy())
print(total)
Решение
numbers = input().split()
total = []
result = dict()
for item in numbers:
units = zeros = 0
number = f'{int(item):b}'
result['digits'] = len(number)
result['units'] = number.count('1')
result['zeros'] = number.count('0')
total.append(result.copy())
print(total)
Добрый день, возможно в “Решение” стоит обратить внимание на то, что очень важно при записи словарей в список использовать функцию dict.copy(). Пояснить, что иначе в списке во всех его элементах будет одна и та же ссылка на “последнею версию” словаря.
Здравствуйте! Это относится ко всем изменяемым структурам, а не только к спискам. Упоминание этого факта точно есть в материале параграфа про списки у яндекса. Полагаю, вашего комментария будет достаточно всем, кто захочет чуть внимательнее изучить тему. Спасибо, что обратили на это внимание.
Подскажите, пожалуйста, такой вариант приемлем, когда словарь зануляется в начале цикла, или в практике программирования все же более универсальным является вариант через .copy()?
С точки зрения правильности кода
text = input()
number_list = text.split(‘ ‘)
itog = []
for numbers in number_list:
number = int(numbers)
count_digits = 0
count_units = 0
count_zeros = 0
parts = {}
while number >= 1:
if number % 2 == 0:
count_zeros += 1
else:
count_units += 1
number //= 2
count_digits += 1
parts[“digits”] = count_digits
parts[“units”] = count_units
parts[“zeros”] = count_zeros
itog.append(parts)
print(itog)
Это не совсем пересекающиеся истории.
Если вам не нужно сохранять значения словаря, то его можно смело обнулять каждый цикл. Если же вам надо модифицировать словарь, таким образом, чтобы не испортить оригинальный, то пользуйтесь .copy()