Подскажите, куда лучше впихнуть одноразовую функцию?
with open('logfile.txt', 'r', encoding='utf-8') as logfile, open('output.txt', 'w', encoding='utf-8') as output_file:
users = map(lambda x: x.split(', '), logfile.read().split('\n'))
def minutes(user, time_in, time_out):
hours, mins = time_in.split(':')
time_in = int(hours) * 60 + int(mins)
hours, mins = time_out.split(':')
time_out = int(hours) * 60 + int(mins)
return time_out - time_in >= 60
for user in filter(lambda x: minutes(*x), users):
print(user[0], file=output_file)
Задание заключается в том, чтобы записать в файл все имена пользователей, время нахождения за компьютером которых было не менее 60 минут. Функция работает всего один раз, потому вопрос - есть ли смысл выносить ее в "глобальный код"? или, быть может возможно обойтись и вовсе без функции?
Сам файл для чтения содержит:
Тимур Гуев, 14:10, 15:50
Джагмаидзе Ирбек, 00:00, 00:59
Руслан Гриценко, 12:00, 12:59
Роман Гацалов, 09:10, 17:45
Габолаев Георгий, 11:10, 12:10
Гергиева Светлана, 09:10, 21:45
Гуева Лариса, 07:05, 08:05
Засеев Ирбек, 00:00, 01:00
Гуева Лиза, 09:05, 10:05
Харисов Артур, 19:07, 20:07
Джабиев Алан, 17:56, 18:55
Янченко Роман, 00:00, 01:01
Ответы (2 шт):
Автор решения: neo-noir
→ Ссылка
with open('logfile.txt', 'r', encoding='utf-8') as f_in, open('output.txt', 'w', encoding='utf-8') as f_out:
for line in f_in:
name, time_in, time_out = line.split(',')
hours_in, minutes_in = time_in.split(':')
hours_out, minutes_out = time_out.split(':')
if (int(hours_out) * 60 + int(minutes_out)) - (int(hours_in) * 60 + int(minutes_in)) >= 60:
f_out.write(name + '\n')
Вот вам решение без функции. Использование функций - хорошая вещь, но в данном случае если бы вы оформили всю задачу как функцию, чтобы она была применима где-то еще. Например на вход подается файл, в котором будут указаны другие данные.
Автор решения: Namerek
→ Ссылка
Фантазия на тему
from datetime import datetime, timedelta
import csv
def deep_strip(obj):
if isinstance(obj, dict):
for k, v in obj.items():
obj[k] = deep_strip(v)
elif isinstance(obj, list):
return list(map(deep_strip, obj))
elif isinstance(obj, str):
obj = obj.strip()
try:
return datetime.strptime(obj, '%H:%M')
except (ValueError, TypeError):
return obj
return obj
with open('../input.txt', 'r', encoding='utf-8') as inp:
data = list(map(deep_strip, csv.DictReader(inp, fieldnames=['name', 'start', 'end'])))
for item in data:
duration = item['end'] - item['start']
print(
item['name'],
duration,
duration > timedelta(minutes=60)
)
Тимур Гуев 1:40:00 True
Джагмаидзе Ирбек 0:59:00 False
Руслан Гриценко 0:59:00 False
Роман Гацалов 8:35:00 True
Габолаев Георгий 1:00:00 False
Гергиева Светлана 12:35:00 True
Гуева Лариса 1:00:00 False
Засеев Ирбек 1:00:00 False
Гуева Лиза 1:00:00 False
Харисов Артур 1:00:00 False
Джабиев Алан 0:59:00 False
Янченко Роман 1:01:00 True