0

私はメールと日付を持っています。ネストされた 2 つの for ループを使用して、同じ日に送信されたメールを選択できますが、「スマートな方法」で効率的に行うにはどうすればよいですか?

# list of tuples - (email,date)

for entry in list_emails_dates:
    current_date = entry[1]
    for next_entry in list_emails_dates:
        if current_date = next_entry[1]
        list_one_date_emails.append(next_entry)

より短いコードで記述できることは知っていますが、わからないかitertools、使用する可能性がmapありxrangeます。

4

2 に答える 2

2

日付に関連するすべての電子メールを同じキーに収集することで、これを辞書に変換するだけです。

これを行うには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'
于 2014-07-27T08:17:51.190 に答える