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. 電子メールをキーとして使用する理由 msg1、msg4、および msg5 を別々の電子メールで送信する代わりに、電子メール アドレス 4 に電子メールを送信するとします。これらを 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'],
    ...

そのためには、辞書を一度調べればよいだけです。

この 2 つ目の辞書があれば、問題を解決するのはかなり簡単です。

于 2013-02-06T09:54:43.947 に答える