Сгруппируйте электронные письма в TO и CC с помощью itertools.groupby и преобразуйте их в словарь.

Я хотел бы сгруппировать электронные письма по их домену и преобразовать результат в словарь. До сих пор я понял, чтоitertools.groupbyс пользовательской функцией сделает это. Он правильно назначает ключи каждому значению, но когда я пытаюсь создать словарь, используется только последнее значение, когда значения для группировки не продолжаются.

      
import re
from itertools import groupby

{k: list(v) for k, v in groupby(["bar", "foo", "baz"], key=lambda x: "to" if re.search(r"^b", x) else "cc")}

Это произведет{'to': ['baz'], 'cc': ['foo']}вместо{'to': ['bar', 'baz'], 'cc': ['foo']}.

Как я могу это исправить?

1 ответ

Сначала отсортируйте группу, чтобы получить правильный результат (itertools.groupbyгруппирует непрерывные элементы):

      import re
from itertools import groupby

out = {
    k: list(v)
    for k, v in groupby(
        sorted(
            ["awol", "bar", "foo", "baz"],
            key=lambda x: bool(re.search(r"^b", x)),
        ),
        key=lambda x: "to" if re.search(r"^b", x) else "cc",
    )
}

print(out)

Отпечатки:

      {'cc': ['awol', 'foo'], 'to': ['bar', 'baz']}
Другие вопросы по тегам