Напишите утилиту, которая разделяет числа, записанные в файле, на три группы:
- числа с преобладающим количеством чётных цифр;
- числа с преобладающим количеством нечётных цифр;
- числа с одинаковым количеством чётных и нечётных цифр.
Формат ввода
Пользователь вводит четыре имени файла.
Первый файл содержит произвольное количество чисел, разделённых пробелами и символами перевода строки.
Формат вывода
В три другие файла выведите числа, которые подходят под требуемое условие.
Сохраните положение чисел в строках.
Пример
Ввод
# Пользовательский ввод:
numbers.txt
even.txt
odd.txt
eq.txt
# Содержимое файла numbers.txt
650975472 591084323 629700 1504180 577023
8460612246 42161437 29409368 58531725 5725268 2198001838
796451 69358 7195510 975628465 9756641
44200289 126541 979391 93479581 291170 28987042 86139603
Вывод
# Содержимое файла even.txt
629700 1504180
8460612246 29409368 5725268 2198001838
975628465
44200289 28987042
# Содержимое файла odd.txt
650975472 591084323 577023
58531725
796451 69358 7195510 9756641
979391 93479581 291170
# Содержимое файла eq.txt
42161437
126541 86139603
Решение
Основная сложность для учеников заключается в сохранении номеров строк, на которых находились числа. В остальном задачка не сильно сложная.
Читаем построчно файл. Каждую строку разбиваем на числа и любым удобным для нас способом считаем количество четных и нечетных цифр в числе. Если преобладают четные – записываем число в список четных, если нечетные – в список нечетных. Если количество четных и нечетных совпало – в список неопределившихся. По окончанию строки, все три списка дописываются каждый в свой файл.
Как вариант, можно накапливать списки строк для каждого файла отдельно, и записать все в один присест в самом конце.
Можно все содержимое каждого из файлов вообще записывать в одну результирующую строку и писать весь файл обычным write().
Посмотреть код
Решение
input_file = input()
evens_file = input()
odds_file = input()
equals_file = input()
with open(input_file, encoding="UTF-8") as file:
strings = [string for string in file.read().split("\n") if string]
even_digits = "02468"
odd_digits = "13579"
for string in strings:
evens, odds, equals = [], [], []
for number in string.split():
total_evens = total_odds = 0
for char in number:
if char in even_digits:
total_evens += 1
elif char in odd_digits:
total_odds += 1
if total_evens > total_odds:
evens.append(number)
elif total_evens < total_odds:
odds.append(number)
else:
equals.append(number)
with open(evens_file, "a", encoding="UTF-8") as file:
file.write(" ".join(evens) + "\n")
with open(odds_file, "a", encoding="UTF-8") as file:
file.write(" ".join(odds) + "\n")
with open(equals_file, "a", encoding="UTF-8") as file:
file.write(" ".join(equals) + "\n")
Решение
input_file = input()
evens_file = input()
odds_file = input()
equals_file = input()
with open(input_file, encoding="UTF-8") as file:
strings = [string for string in file.read().split("\n") if string]
even_digits = "02468"
odd_digits = "13579"
evens_strings = []
odds_strings = []
equals_strings = []
for string in strings:
evens, odds, equals = [], [], []
for number in string.split():
total_evens = total_odds = 0
for char in number:
if char in even_digits:
total_evens += 1
elif char in odd_digits:
total_odds += 1
if total_evens > total_odds:
evens.append(number)
elif total_evens < total_odds:
odds.append(number)
else:
equals.append(number)
evens_strings.append(' '.join(evens) + '\n')
odds_strings.append(' '.join(odds) + '\n')
equals_strings.append(' '.join(equals) + '\n')
with open(evens_file, "w", encoding="UTF-8") as file:
file.writelines(evens_strings)
with open(odds_file, "w", encoding="UTF-8") as file:
file.writelines(odds_strings)
with open(equals_file, "w", encoding="UTF-8") as file:
file.writelines(equals_strings)
Решение
input_file = input()
evens_file = input()
odds_file = input()
equals_file = input()
with open(input_file, encoding="UTF-8") as file:
strings = [string for string in file.read().split("\n") if string]
even_digits = "02468"
odd_digits = "13579"
evens_string = ''
odds_string = ''
equals_string = ''
for string in strings:
evens, odds, equals = [], [], []
for number in string.split():
total_evens = total_odds = 0
for char in number:
if char in even_digits:
total_evens += 1
elif char in odd_digits:
total_odds += 1
if total_evens > total_odds:
evens.append(number)
elif total_evens < total_odds:
odds.append(number)
else:
equals.append(number)
evens_string += ' '.join(evens) + '\n'
odds_string += ' '.join(odds) + '\n'
equals_string += ' '.join(equals) + '\n'
with open(evens_file, "w", encoding="UTF-8") as file:
file.write(evens_string)
with open(odds_file, "w", encoding="UTF-8") as file:
file.write(odds_string)
with open(equals_file, "w", encoding="UTF-8") as file:
file.write(equals_string)
file_in = input().strip()
evens_file = input().strip()
odds_file = input().strip()
equals_file = input().strip()
with open(file_in, encoding='UTF-8') as file:
enter = '\n'
even_nums, odd_nums, eq_nums = '', '', ''
for line in file.readlines():
for number in line.split():
count_even = len([num for num in number if int(num) % 2 == 0])
if count_even > len(number) / 2:
even_nums += f'{number} '
elif count_even < len(number) / 2:
odd_nums += f'{number} '
else:
eq_nums += f'{number} '
even_nums += enter
odd_nums += enter
eq_nums += enter
with open(evens_file, 'w', encoding='UTF-8') as even:
even.write(even_nums)
with open(odds_file, 'w', encoding='UTF-8') as odd:
odd.write(odd_nums)
with open(equals_file, 'w', encoding='UTF-8') as eq:
eq.write(eq_nums)
скажите, пожалуйста, можно ли создать файл с разделением на строки другим способом??
что можно использовать вместо
even_nums += ‘\n’
??
Добрый день!
Мне кажется, что в этой задаче больше особо ничего не придумаешь.
Или записывать все в файлы по мере построчного считывания, как это сделано у меня, или запоминать и потом уже писать всем скопом, как это сделано у вас.
Вариации тут только на этапе формирования строк для записи и организации их хранения.
Еще, лучше код вставлять с помощью виджета кода. Он обозначен знаком </> в окне прямо над кнопками ОТМЕНИТЬ / СОХРАНИТЬ.
Тогда он будет выглядеть так:
Сохранил. Буду использовать как алгоритм.
я не уверен, но мне кажется что при редактирование виджет кода выключился
я видел что код не в виджете.
не догадался исправить
в начале ознакомления с задачей я еще помнил, но ближе к реализации функции уже догадался только на импорт библиотеки)))
with open(input(), encoding=”UTF-8″) as file_in:
with open(input(), “w”, encoding=”UTF-8″) as evenf:
with open(input(), “w”, encoding=”UTF-8″) as oddf:
with open(input(), “w”, encoding=”UTF-8″) as eqf:
for line in file_in:
for num in line.split():
even = 0
odd = 0
for digit in num:
if int(digit) % 2 == 0:
even += 1
else:
odd += 1
if even > odd:
evenf.write(num + ‘ ‘)
elif even < odd:
oddf.write(num + ‘ ‘)
else:
eqf.write(num + ‘ ‘)
evenf.write(‘\n’)
oddf.write(‘\n’)
eqf.write(‘\n’)
Думаю, в вашем верхнем решении:
data = []
odds = []
evens = []
def enter_results(*numbers):
global data, odds, evens
data.extend(list(numbers))
odds = data[::2]
evens = data[1::2]
Можно обойтись без data :
odds = []
evens = []
def enter_results(*numbers):
global odds, evens
odds.extend(list(numbers[::2]))
evens.extend(list(numbers[1::2]))
А, поскольку, по условию задачи, количество добавляемых чисел всегда чётное, то во втором решении вероятно можно убрать переменную
is_even = True
оно там исключительно для универсальности. введение data делает условие “гарантируется, что количество данных будет четным” неважным.