Форум сайта python.su
73
py.user.nextэто понятно но теперь получается что бы найти данные иванова петра нам надо перебирать весь список словарей чтоб найти там иванова а потом еще проверить имя что это петр а не саша и потом получить данные
К одному человеку относится куча всяких значений. Поэтому для одного человека делается один словарь и все данные в нём относятся только к этому человеку
data = [{'surname': 'Иванов', 'firstname': 'Петр', 'status': 'Герой труда', 'salary': 100000}, {'surname': 'Иванов', 'firstname': 'Саша', 'status': None, 'salary': 5100}, {'surname': 'Сидоров', 'firstname': 'Андрей', 'status': 'Старик', 'salary': 12345}] for i in data: if 'Иванов' == i.get('surname') and 'Петр' == i.get('firstname'): print(i['status']) # Герой труда
data = {'Иванов Петр' : {'status': 'Герой труда', 'salary': 100000}, 'Иванов Саша ': {'firstname': '', 'status': None, 'salary': 5100}, 'Сидоров Андрей' : {'status': 'Старик', 'salary': 12345}} print(data.get('Иванов Петр')['status']) # Герой труда
Отредактировано marvellik (Янв. 18, 2018 12:22:24)
Офлайн
857
marvellikДопустим, ты так сделал. А теперь найди всех Ивановых или найди всех героев труда с заданным именем. То есть тебе опять надо это разделять - то, что ты склеил там.
нам же ничего не мешает данные относящиеся к одному человеку записать в значение в виде словаря
marvellikЭто вот ты поправил, я прочитать не успел до ответа. Вот я тебе и говорю, я этих полных тёзок в реале видел (хотя они были не полные тёзки из-за разных отчеств).
единственное что могут быть полные тезки в списке что не даст создать в словаре два одинаковых ключа, когда ваш вариант позволяет записать хоть 10 тезок
marvellikif 'Иванов' == i.get('surname') and 'Петр' == i.get('firstname'):
if i['firstname'] + i['surname'] == 'ПётрИванов':
Отредактировано py.user.next (Янв. 18, 2018 12:43:17)
Офлайн
73
py.user.next ну да в общем полные тезки портят всю картину(у меня на работе начальник автопарка и водитель полные тезки так их по должности уточняем кто есть кто ). в общем я так понял что все равно при поиске каких либо данных придется перебирать весь список словарей
Офлайн
0
Ну-с, py.user.next, судите.
def func_get_dict(file): with open(file, encoding='UTF-8') as f: for j, l in enumerate(f): if j == 0: l = re.sub(r'\s+', ' ', l) keys_hours = l.split(' ')[:3] else: l = re.sub(r'\s+', ' ', l) res_hours = l.split(' ')[:3] if func_check(dict_workers, dict(zip(keys_hours, res_hours))): # <--- здесь return dict(zip(keys_hours, res_hours)) def func_check(dict1, dict2): return True if dict1['Имя'] == dict2['Имя'] and \ dict1['Фамилия'] == dict2['Фамилия'] else False with open('data//workers', encoding='UTF-8') as fp: for i, line in enumerate(fp): if i == 0: line = re.sub(r'\s+', ' ', line) keys_workers = line.split(' ')[:5] else: line = re.sub(r'\s+', ' ', line) res_workers = line.split(' ')[:5] dict_workers = dict(zip(keys_workers, res_workers)) dict_hours = func_get_dict('data//hours_of') norm = int(dict_workers['Норма_часов']) wage = int(dict_workers['Зарплата']) fact = int(dict_hours['Отработано']) pay = fact / norm * wage if fact <= norm else wage * (2 * fact - norm) / norm print('{} {} {} к выплате {}'.format(dict_workers['Имя'], dict_workers['Фамилия'], dict_workers['Должность'], pay))
Офлайн
73
SomethingButNotNickNameя тоже реализовал чтение всех данных из файла в словари а файл построен так что заголовки и будут ключами поэтому думаю
У меня ключи словаря вытащены из файла
def receipt(path): with open(path,'r', encoding='utf_8_sig') as f: data = f.readlines() head = data.pop(0).split() return [dict(zip(head,i.split())) for i in data] print(receipt('workers.txt')) print() print(receipt('hours_of.txt'))
Отредактировано marvellik (Янв. 18, 2018 19:54:16)
Офлайн
857
SomethingButNotNickNameСловари надо составлять со своими названиями полей. Не надо эти названия брать из файла. Во-первых, их там может не быть вообще (чаще всего так и бывает), а во-вторых, как только их решат поменять те, кто делает эти файлы, вся твоя программа сразу сломается.
Ну-с, py.user.next, судите.
Отредактировано py.user.next (Янв. 19, 2018 10:26:15)
Офлайн