Сгруппируйте электронные письма в 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']}