Найти - Пользователи
Полная версия: Регулярные выражения
Начало » Python для новичков » Регулярные выражения
1 2
marvellik
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'])
#  Герой труда
так же проще ? или я что то не так понимаю ? единственное что могут быть полные тезки в списке что не даст создать в словаре два одинаковых ключа, когда ваш вариант позволяет записать хоть 10 тезок

py.user.next
marvellik
нам же ничего не мешает данные относящиеся к одному человеку записать в значение в виде словаря
Допустим, ты так сделал. А теперь найди всех Ивановых или найди всех героев труда с заданным именем. То есть тебе опять надо это разделять - то, что ты склеил там.
А второе ещё: знаешь, что бывают полные тёзки? У нас в группе училось две Наташи с одинаковыми фамилиями. Их потом преподша так и звала “Наташа первая” и “Наташа вторая” по времени их появления в группе. Вторая пришла на четвёртый курс из колледжа, а первая была изначально. Поэтому их так пронумеровала преподша.
А в словаре ты не сделаешь два одинаковых ключа. Это же нагруженное множество. Во множестве только уникальные значения могут быть.

marvellik
единственное что могут быть полные тезки в списке что не даст создать в словаре два одинаковых ключа, когда ваш вариант позволяет записать хоть 10 тезок
Это вот ты поправил, я прочитать не успел до ответа. Вот я тебе и говорю, я этих полных тёзок в реале видел (хотя они были не полные тёзки из-за разных отчеств).

А как искать проще
marvellik
 if 'Иванов' == i.get('surname') and 'Петр' == i.get('firstname'):
 if i['firstname'] + i['surname'] == 'ПётрИванов':
Можно и через регулярное выражение проверить это.
marvellik
py.user.next ну да в общем полные тезки портят всю картину(у меня на работе начальник автопарка и водитель полные тезки так их по должности уточняем кто есть кто ). в общем я так понял что все равно при поиске каких либо данных придется перебирать весь список словарей
SomethingButNotNickName
Ну-с, 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))
Я искренне пытался не создавать путаницы и учесть Ваши посты.
Пару вопросов:
1)PyCharm мне пишет предупреждения, что variable ‘keys_hours’ might be referenced before assignment (в коде пометил). Формально он конечно прав, но мы то понимаем, что данная ситуация не возможна при не пустом файле базы данных. А нам, по-хорошему, надо сделать проверки наличия и содержания файла . Стоит ли обращать внимание на подобные замечания?
2) У меня ключи словаря вытащены из файла и соответственно состоят из кириллицы. Допустимо ли использование таких ключей? Или надо было создать список name, surname итд?
marvellik
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'))
py.user.next
SomethingButNotNickName
Ну-с, py.user.next, судите.
Словари надо составлять со своими названиями полей. Не надо эти названия брать из файла. Во-первых, их там может не быть вообще (чаще всего так и бывает), а во-вторых, как только их решат поменять те, кто делает эти файлы, вся твоя программа сразу сломается.
Так что не вижу у тебя файлов, преобразованных в потоки словарей с удобными названиями полей, которые контролируются только тобой.

И функции ты делаешь неправильно. Нужно сделать функцию, которая только преобразует строку, а ты делаешь функцию, которая и читает файл, и разделяет строку, и что-то проверяет в строке, и создаёт словарь какой-то. Все функции должны быть разделены, потому что если надо будет заменить чтение из файла на чтение из базы данных, то ты не сможешь заменить этот кусок, не затрагивая код, который не относится к этому.

В общем, нет смысла приводить тебе примеры, ты их всё равно не читаешь. Делаешь что-то по-своему, потому что тебе там что-то кажется, а получается в итоге свалка. Я бы мог тебе привести пример чтения файла в поток словарей, но ты его не будешь читать, а время на пустые разговоры тратить жалко.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB