使用python在字典中交叉多个列表

时间:2013-02-06 09:48:56

标签: python

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

假设我有这样的字典:

{
    '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,我想将它们合并为一封电子邮件。
  2. 元组键 这只是一个演示,我当然可以使用元组,但是如何解决我的问题呢?
  3. 全部谢谢

3 个答案:

答案 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'],
    ...

要这样做,你只需要翻阅一下你的词典。

一旦你有了第二个词典,解决你的问题就会非常简单。