使用 itertools.groupby 将电子邮件分组到 TO & CC 中,并将其转换为字典



我想按域对电子邮件进行分组,并将结果转换为字典。到目前为止,我已经发现带有自定义函数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']}

我该怎么解决?

首先对组进行排序以获得正确的结果(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']}

您可以在list中使用dict.setdefaultcollections.defaultdict(list)extend,如下所示。

# from collections import defaultdict
# dct = defaultdict(list)
from itertools import groupby
import re
dct = {}
for k, v in groupby(["awol", "bar", "foo", "baz"], 
key=lambda x: "to" if re.search(r"^b", x) else "cc"):
dct.setdefault(k,[]).extend(list(v))
# If you use 'dct = defaultdict(list)'. You can add item in 'list' like below
# dct[k].extend(list(v))
print(dct)

{'cc': ['awol', 'foo'], 'to': ['bar', 'baz']}

最新更新