日付に関連するすべての電子メールを同じキーに収集することで、これを辞書に変換するだけです。
これを行うにはdefaultdict
、コレクションから使用する必要があります。ディクショナリの新しいキーにデフォルト値を与える簡単な方法です。
ここでは、関数 list
を渡しているため、辞書内の新しい各キーがデフォルト値としてリストを取得します。
emails = defaultdict(list)
for email,email_date in list_of_tuples:
emails[email].append(email_date)
これで、emails['2013-14-07']
その日付のメールのリストになります。
を使用せず、defaultdict
次のように辞書内包表記を行う場合:
emails = {x[1]:x[0] for x in list_of_tuples}
同じキーに割り当てるとその値が上書きされるため、日付ごとに 1 つのエントリがあり、これがその最後のメールになります。ディクショナリは、キーによって値を検索する最も効率的な方法です。リストは、一連の値の中の位置で値を検索する場合に適しています (位置がわかっている場合)。
なんらかの理由でリファクタリングできない場合は、ジェネレーターを作成するこのテンプレート メソッドを使用できます。
def find_by_date(haystack, needle):
for email, email_date in haystack:
if email_date == needle:
yield email
使用方法は次のとおりです。
>>> email_list = [('foo@bar.com','2014-07-01'), ('zoo@foo.com', '2014-07-01'), ('a@b.com', '2014-07-03')]
>>> all_emails = list(find_by_date(email_list, '2014-07-01'))
>>> all_emails
['foo@bar.com', 'zoo@foo.com']
または、これを行うことができます:
>>> july_first = find_by_date(email_list, '2014-07-01')
>>> next(july_first)
'foo@bar.com'
>>> next(july_first)
'zoo@foo.com'