0

这一直困扰着我一整天。我需要向不同的人发送电子邮件,有些电子邮件可能有多个收件人,有些收件人会收到多个电子邮件。

所以假设我有一本这样的字典:

{
    'email4': ['msg1', 'msg4', 'msg5'], 
    'email2': ['msg1', 'msg3'], 
    'email3': ['msg1', 'msg2', 'msg4'], 
    'email1': ['msg1', 'msg2', 'msg3']
}

我想制作类似的东西:

{
    'email1, email2, email3, email4': ['msg1'],
    'email1, email3': ['msg2'],
    'email1, email2': ['msg3'],
    'email3, email4': ['msg4'],
    'email4': ['msg5']
}

我认为这将是字典之类的键和值的多重交集,无论如何,你明白了。

快速提问,我如何在 python 中做到这一点。

感谢您的帮助,祝您有美好的一天。

更新

  1. 为什么使用电子邮件作为键 假设我要将电子邮件发送到电子邮件地址 4,而不是在单独的电子邮件中发送 msg1、msg4 和 msg5,我想将它们组合成 1 封电子邮件。
  2. 元组键这只是一个演示,我当然可以使用元组,但这将如何解决我的问题?

谢谢大家

4

3 回答 3

2

defaultdict使用集合作为中间数据结构的示例:

#!/usr/bin/env python
# encoding: utf-8

from collections import defaultdict
from pprint import pprint

messages = { 
    'email4': ['msg1', 'msg4', 'msg5'],
    'email2': ['msg1', 'msg3'],
    'email3': ['msg1', 'msg2', 'msg4'],
    'email1': ['msg1', 'msg2', 'msg3']
}

intermediate = defaultdict(set)

for email, msgs in messages.items():
    for msg in msgs:
        intermediate[msg].add(email)

inverted = {tuple(v): k for k, v in intermediate.items()}
pprint(inverted)

# {('email2', 'email1'): 'msg3',
#  ('email3', 'email1'): 'msg2',
#  ('email4',): 'msg5',
#  ('email4', 'email2', 'email3', 'email1'): 'msg1',
#  ('email4', 'email3'): 'msg4'}
于 2013-02-06T10:00:14.060 回答
1

第一个建议:消息索引和收件人列表键,易于使用:

from collections import defaultdict
from pprint import pprint

data = {
    'email4': ['msg1', 'msg4', 'msg5'], 
    'email2': ['msg1', 'msg3'], 
    'email3': ['msg1', 'msg2', 'msg4'], 
    'email1': ['msg1', 'msg2', 'msg3']
}

result = defaultdict(list)

for addr, msgs in data.iteritems():
    for msg in msgs:
        result[msg].append(addr)

pprint(result)

如果您只想合并消息:

for addr, msgs in data.iteritems():
    data[addr] = '\n'.join(msgs)

print data
于 2013-02-06T09:59:37.080 回答
0

您首先需要制作一个与您现在拥有的字典“反向”的字典:其中键是消息,值是收件人:

{
    'msg1': ['email1', 'email2', 'email3', 'email4'],
    'msg2': ['email1', 'email3'],
    ...

为此,您只需浏览您的字典一次。

一旦你有了第二个字典,解决你的问题就相当简单了。

于 2013-02-06T09:54:43.947 回答