• Предмет: Информатика
  • Автор: addenisovih
  • Вопрос задан 4 месяца назад

Python. Напишите программу, которая принимает на вход список из строк, содержащих числа, и возвращает список из чисел, которые являются степенями двойки. Если в исходном списке есть строки, которые не являются числами или не являются степенями двойки, программа должна игнорировать эти элементы.


Например, если на входе список ['2', '4', '8', '9', '16', 'abc'], то программа должна вернуть список [2, 4, 8, 16], так как только 2, 4, 8 и 16 являются степенями двойки, а строка 'abc' не является числом.

Ответы

Ответ дал: Аноним
2

Ответ:

Програма запрашивает у пользователя данные через кому, например: 2, 4, 8, 9, 16, abc.

user_list = input('Введите числа через кому: ').split(',')

result = []  # Тут будет наш готовый список

for s in user_list:

   try:

       number = int(s)

       # Проверка на степень

       if number > 0 and (number & (number - 1)) == 0:

           result.append(number)

   except ValueError:

       pass

# Выводим результат

print(result)

Приложения:

addenisovih: Спасибо
Аноним: Строку кода user_list = user_list.replace(', ', ',').split(',') можно облегчить, если вместо метода replace просто сразу использовать в качестве аргумента не ',', а ', '. Тогда мы получаем user_list = user_list.split(', ')
Аноним: Так же лучше объединить две строки user_list = input('Введите числа через кому: ') и user_list = user_list.split(', ') в одну, получая user_list = input('Введите числа через кому: ').split(", ")
Аноним: Я разделил на две строки, так как я придерживался правилам стилизации кода PEP8
Аноним: А использовал replace, так как пользователь может ввести ", ", а не просто кому
Аноним: Ну можно и без использования replace, щас исправлю
Аноним: Спасибо за замечание!
Аноним: Обычно в задачах пример кода дает человеку понять, что данные должны вводиться только "таким" способом, а выводиться только "таким", никак иначе. Исключением являются программы, которые создаются под прихоти определенного человека, но тогда он сам должен ставить необходимые "рамки" и условия.
Ответ дал: Аноним
2

Объяснение:

  • Приведенный мною код очень лаконичный, однако некоторые детали в нем требуют разъяснения.
  • Для начала мы создаем переменную str_arr, в которую сохраняем строку-список, полученный на входе. Далее с помощью генератора исправляем нашу строку, используя методы обрезания strip(), чтобы метод split() смог правильно разбить ее на список из строковых значений, который мы впоследствии сможем использовать.
  • С помощью цикла проходим по списку и проверяем каждый элемент:
  • Если этот элемент число, и этот элемент не равен 0, и этот элемент является степенью двойки, то в другой список int_arr мы добавляем это число.
  • Немного остановимся на условии проверки числа на соответствие степени двойки. Я использовал побитовый оператор И (&), который сравнивает биты двух чисел: элемент списка и его "левый сосед", и если результат их сравнения равен 0, то это число является степенью двойки.

Код Python 3.10:

str_arr = [a.strip("'") for a in input().lstrip("[").rstrip("]").split(', ')]

int_arr = []

for x in str_arr:

   if x.isdigit() is True and int(x) != 0 and (int(x) & (int(x) - 1)) == 0:

       int_arr.append(x)

print(int_arr)

Результат:

Ввод: ['2', '4', '8', '9', '16', 'abc']

Вывод: [2, 4, 8, 16]

Вас заинтересует