这一直困扰着我一整天。我需要向不同的人发送电子邮件,有些电子邮件可能有多个收件人,有些收件人会收到多封电子邮件。
假设我有这样的字典:
{
'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中执行此操作。
感谢您的帮助,祝您度过愉快的一天。
全部谢谢
答案 0 :(得分: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'}
答案 1 :(得分: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
答案 2 :(得分:0)
你首先需要制作一个与你现在所拥有的词典“相反”的词典:一个是键是消息并且为接收者赋值:
{
'msg1': ['email1', 'email2', 'email3', 'email4'],
'msg2': ['email1', 'email3'],
...
要这样做,你只需要翻阅一下你的词典。
一旦你有了第二个词典,解决你的问题就会非常简单。