Форум сайта python.su
Добрый день.
Есть файл в котором строками прописаны сотрудники и их оклад. Причем между фамилией и именем может быть какая то еще информация. Какая именно неизвестно. Например строка выглядит так.
line = 'Петров Герой труда Петр 100000'
surname = 'Петров' # имена и фамилии также хранятся в соответствующих переменных. import re if len(re.findall(surname, line)) != 0: pay = re.findall(r'\d+', line) print(pay)
Отредактировано SomethingButNotNickName (Янв. 17, 2018 16:23:59)
Офлайн
Напиши функцию, которая принимает строку файла и возращает словарь, в котором данные из строки разделены по ключам. Потом просто каждую строку передаёшь в эту функцию и в полученном из неё словаре ищешь нужные данные.
Отредактировано py.user.next (Янв. 17, 2018 16:27:47)
Офлайн
py.user.nextКак вариант - да.
Напиши функцию, которая принимает строку файла и возращает словарь, в котором данные из строки разделены по ключам. Потом просто каждую строку передаёшь в эту функцию и в полученном из неё словаре ищешь нужные данные.
Офлайн
Дело в том, что:
1) условие задачи целиком выглядит так
# Задание-1: Решите задачу (дублированную ниже):
# Дана ведомость расчета заработной платы (файл “data/workers”). Рассчитайте зарплату всех работников,
# зная что они получат полный оклад, если отработают норму часов. Если же они отработали меньше нормы,
# то их ЗП уменьшается пропорционально, а за заждый час переработки они получают удвоенную ЗП,
# пропорциональную норме.
# Кол-во часов, которые были отработаны, указаны в файле “data/hours_of”
# С использованием классов.
# Реализуйте классы сотрудников так, чтобы на вход функции-конструктора каждый работник получал строку из файла
т.е. то, что вы предлагаете засунуть в словарь уже находится внутри класса.
2) половина данных о сотруднике лежит в одном файле, а половина (включая и з/п) в другом.
И мне нужны данные из обоих файлов. А строки в них перемешаны до кучи.
Файлы тоже с датой вложил
Отредактировано SomethingButNotNickName (Янв. 17, 2018 17:03:53)
Прикреплённый файлы:
workers.txt (921 байт)
Офлайн
второй файл
Прикреплённый файлы:
hours_of.txt (307 байт)
Офлайн
Первая копия workers не верная.
Правильная тут
Прикреплённый файлы:
workers.txt (922 байта)
Офлайн
SomethingButNotNickNameЭто тебе кажется так.
т.е. то, что вы предлагаете засунуть в словарь уже находится внутри класса
SomethingButNotNickNameРегулярки используются только внутри таких функций для разделения строк на поля. Больше нигде. Когда словарь для одной строки файла возвращён, поля в нём разделены точно и имеют удобные имена, поэтому никакие регулярки больше не требуются.
Ну а насчет регулярок?
>>> import re >>> >>> def split1(s): ... parts = re.findall(r'^(\S+).*\s(\S+)\s+(\d+)$', s)[0] ... out = {'surname': parts[0], ... 'firstname': parts[1], ... 'salary': int(parts[2])} ... return out ... >>> >>> s = 'Петров Герой труда Петр 100000' >>> >>> d = split1(s) >>> d {'surname': 'Петров', 'firstname': 'Петр', 'salary': 100000} >>> d['salary'] * 2 200000 >>>
>>> import re >>> >>> def split1(s): ... parts = re.findall(r'^(\S+).*\s(\S+)\s+(\d+)$', s)[0] ... out = {'surname': parts[0], ... 'firstname': parts[1], ... 'salary': int(parts[2])} ... return out ... >>> >>> lst = ['Петров Герой труда Петр 100000', ... 'Иванов Саша 5100', ... 'Сидоров Старик Андрей 12345'] >>> >>> out = list(map(split1, lst)) >>> out [{'surname': 'Петров', 'firstname': 'Петр', 'salary': 100000}, {'surname': 'Иванов', 'firstname': 'Саша', 'salary': 5100}, {'surname': 'Сидоров', 'firstname': 'Андрей', 'salary': 12345}] >>>
>>> import re >>> >>> def split1(s): ... parts = re.findall(r'^(\S+)\s*(.*)\s+(\S+)\s+(\d+)$', s)[0] ... out = {'surname': parts[0], ... 'firstname': parts[2], ... 'status': parts[1] or None, ... 'salary': int(parts[3])} ... return out ... >>> >>> lst = ['Петров Герой труда Петр 100000', ... 'Иванов Саша 5100', ... 'Сидоров Старик Андрей 12345'] >>> >>> out = list(map(split1, lst)) >>> out [{'surname': 'Петров', 'firstname': 'Петр', 'status': 'Герой труда', 'salary': 100000}, {'surname': 'Иванов', 'firstname': 'Саша', 'status': None, 'salary': 5100}, {'surname': 'Сидоров', 'firstname': 'Андрей', 'status': 'Старик', 'salary': 12345}] >>>
Отредактировано py.user.next (Янв. 17, 2018 18:01:41)
Офлайн
насколько я понял предлагается такой алгоритм:
1) сортировка одного из файлов, чтобы конкретному человеку соответствовала строка под одинаковым номером в обоих файлах, т.е. мы перезаписываем один из файлов;
2) в цикле:
а) взять строку первого файла;
б) взять строку второго файла;
в) слепить из них класс, описать в этом классе метод подсчета заработка;
г) запустить метод подсчета заработка и вывести результат.
Таким образом, мы пробежим по обоим файлам и после прочтения строки будем выдавать результат.
И в памяти не будут лежать не нужные словари по сотрудникам, которые ожидают расчета или уже рассчитаны.
Все верно?
и еще вопрос по регулярке
parts = re.findall(r'^(\S+).*\s(\S+)\s+(\d+)$', s)[0]
Офлайн
py.user.next а не проще создать словарь где ключ это имя фамилия ну а значение зарплата?
мне кажется меньше путаницы будет
Офлайн
marvellikК одному человеку относится куча всяких значений. Поэтому для одного человека делается один словарь и все данные в нём относятся только к этому человеку. А полей там может быть сотня.
py.user.next а не проще создать словарь где ключ это имя фамилия ну а значение зарплата?
marvellikПутаница тут возникает только оттого, что SomethingButNotNickName думает, что может сам что-то сделать. Ему говорят “делай словари”, а он такой “нет, мне вот словари не нужны, мне сказали классы какие-то там делать”. Ему опять говорят “делай словари”, а он опять повторяет то же самое. Вот это путаница.
мне кажется меньше путаницы будет
SomethingButNotNickNameА если там будет разное количество людей?
1) сортировка одного из файлов, чтобы конкретному человеку соответствовала строка под одинаковым номером в обоих файлах, т.е. мы перезаписываем один из файлов;
SomethingButNotNickNameИ первая строка - один человек, а другая строка - другой человек. (Это ты отсортировал файлы, в которых есть разные люди, но ты про это не знал.)
а) взять строку первого файла;
б) взять строку второго файла;
SomethingButNotNickNameОно может совпасть с чем-нибудь в середине. Ты никак не контролиуешь то, что в середине не может быть цифр. Например “фамилия ударник завода номер 123 имя зарплата”. Вот чтобы оно в середине ни с чем не совпало, ты говоришь ему “ищи в конце цифры и бери от них первое слово слева”.
$ - указатель на конец строки, т.е. если после цифр будет что-то еще паттерн не должен сработать. А для чего эта проверка?
Отредактировано py.user.next (Янв. 18, 2018 04:15:05)
Офлайн