Непонимание понимания словаря в Python - PullRequest
0 голосов
/ 04 мая 2020

Я пишу парсер, и мне нужно l oop через строки файла, сопоставляя каждую строку с шаблоном регулярных выражений. При этом мне нужно сделать следующее:

with open(filename) as file:
    for line in file.readlines():
        for match in pattern.finditer(line):
            for name, group in match.groupdict().items():
                if group is not None:
                    if name == 'some_group_name':
                        """ do random stuff """
                    elif name == 'some_other_group':
                        """ do some other random stuff """
                    else: raise ParserError('Unknown group')

Сначала я анализирую файл, написанный от руки / человеком, а затем анализирую содержимое по-разному, в зависимости от типа содержимого.

Потому что мне нужно сделать этот вид "для каждой строки в ... для каждого совпадения в строке ... для каждого et c. Et c." Много раз я решал написать функцию генератора для генерации совпадений именованных групп, где группа не None, учитывая некоторый генератор входных данных и шаблон:

def match_gen(gen, pattern):
    return (
        (name, group) for chunk in gen
        for match in pattern.finditer(chunk)
        for name, group in match.groupdict().items()
        if group is not None
    )

Это чудесно, НО это не было Первая попытка, поскольку я сначала хотел вернуть объект dict, который затем мог бы выполнить итерацию (или индексировать с помощью ключей), я впервые попробовал:

def match_gen(gen, pattern):
    return {
        name: group for chunk in gen
        for match in pattern.finditer(chunk)
        for name, group in match.groupdict().items()
        if group is not None
    }

Почти так же, как и первый, за исключением адаптирован к пониманию диктата в соответствии с моим пониманием понимания диктата, что оказывается ошибочным, поскольку последнее решение не приводит к ошибкам, но создает словарь, который содержит только самый последний элемент, добавленный в понимании диктата.

Почему это так? и как нужно изменить приведенный выше код, чтобы правильно создать dict, содержащий все элементы, а не только последний?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...