преобразовать элементы списка на основе типа строки (стиля) - PullRequest
0 голосов
/ 10 октября 2018

У меня есть список, подобный приведенному ниже,

['Message-ID: <5525962.1075855679785.JavaMail.evans@thyme>\r\n',
'Date: Wed, 13 Dec 2000 07:04:00 -0800 (PST)\r\n',
'From: phillip.allen@enron.com\r\n',
'To: christi.nicolay@enron.com, james.steffes@enron.com, jeff.dasovich@enron.com, \r\n',
'\tjoe.hartsoe@enron.com, mary.hain@enron.com, pallen@enron.com,\r\n',
'\tpkaufma@enron.com, richard.sanders@enron.com, \r\n',
'\trichard.shapiro@enron.com, stephanie.miller@enron.com, \r\n',
'\tsteven.kean@enron.com, susan.mara@enron.com, \r\n',
'\trebecca.cantrell@enron.com\r\n',
'Subject: \r\n',
'Mime-Version: 1.0\r\n']

В этом атрибуте To содержится только 3 идентификатора электронной почты, за которыми следуют элементы, некоторые элементы которых начинаются с \t.На самом деле это \t продолжение списка элементов атрибута To.Моя цель - я хочу объединить все недостающие элементы из атрибута To.

До сих пор я использовал приведенный ниже код для решения своей проблемы.

l=['Message-ID: <5525962.1075855679785.JavaMail.evans@thyme>\r\n',
'Date: Wed, 13 Dec 2000 07:04:00 -0800 (PST)\r\n',
'From: phillip.allen@enron.com\r\n',
'To: christi.nicolay@enron.com, james.steffes@enron.com, jeff.dasovich@enron.com, \r\n',
'\tjoe.hartsoe@enron.com, mary.hain@enron.com, pallen@enron.com,\r\n',
'\tpkaufma@enron.com, richard.sanders@enron.com, \r\n',
'\trichard.shapiro@enron.com, stephanie.miller@enron.com, \r\n',
'\tsteven.kean@enron.com, susan.mara@enron.com, \r\n',
'\trebecca.cantrell@enron.com\r\n',
'Subject: \r\n',
'Mime-Version: 1.0\r\n']
act= [ele.rstrip('\r\n') for ele in l if ele.startswith('To: ')]
rem=[ele.lstrip('\t').rstrip('\r\n') for ele in l if ele.startswith('\t')]
act.extend(rem)
act=[''.join(act)]

l=[ele for ele in l if not ele.startswith('To: ') and not ele.startswith('\t')]
l.extend(act)
print l

Вывод:

['Message-ID: <5525962.1075855679785.JavaMail.evans@thyme>\r\n',
'Date: Wed, 13 Dec 2000 07:04:00 -0800 (PST)\r\n',
'From: phillip.allen@enron.com\r\n',
'Subject: \r\n',
'Mime-Version: 1.0\r\n',
'To: christi.nicolay@enron.com, james.steffes@enron.com, jeff.dasovich@enron.com, joe.hartsoe@enron.com, mary.hain@enron.com, pallen@enron.com,pkaufma@enron.com, richard.sanders@enron.com, richard.shapiro@enron.com, stephanie.miller@enron.com, steven.kean@enron.com, susan.mara@enron.com, rebecca.cantrell@enron.com']

Я думаю, что усложнил свой код.

Есть ли какой-нибудь простой или более эффективный способ решения этой проблемы?или где я могу улучшить эффективность моего кода?

любые усилия будут действительно заметны.,

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вы анализируете сообщение электронной почты, это довольно сложно, так как есть много угловых случаев.Вы должны взглянуть на почтовый модуль , чтобы избежать многих подводных камней.

import email

headers = ['Message-ID: <5525962.1075855679785.JavaMail.evans@thyme>\r\n',
  'Date: Wed, 13 Dec 2000 07:04:00 -0800 (PST)\r\n',
  'From: phillip.allen@enron.com\r\n',
  'To: christi.nicolay@enron.com, james.steffes@enron.com, jeff.dasovich@enron.com, \r\n',
  '\tjoe.hartsoe@enron.com, mary.hain@enron.com, pallen@enron.com,\r\n',
  '\tpkaufma@enron.com, richard.sanders@enron.com, \r\n',
  '\trichard.shapiro@enron.com, stephanie.miller@enron.com, \r\n',
  '\tsteven.kean@enron.com, susan.mara@enron.com, \r\n',
  '\trebecca.cantrell@enron.com\r\n',
  'Subject: \r\n',
  'Mime-Version: 1.0\r\n']

mail = email.message_from_string("".join(headers)+"\r\n"+"foo body") # rebuild mail message and parse

for to in email.utils.getaddresses(mail.get_all("to")):
    print(to[1])

производит

christi.nicolay@enron.com
james.steffes@enron.com
jeff.dasovich@enron.com
joe.hartsoe@enron.com
mary.hain@enron.com
pallen@enron.com
pkaufma@enron.com
richard.sanders@enron.com
richard.shapiro@enron.com
stephanie.miller@enron.com
steven.kean@enron.com
susan.mara@enron.com
rebecca.cantrell@enron.com
0 голосов
/ 10 октября 2018

Я понимаю, что символы '\ r', '\ t' и '\ n' являются избыточными и должны быть удалены.
Хотя я не знаю, какие у вас намерения, могу ли я предложить
преобразовать это в словарь для облегчения доступа в будущем.

m_list = ['Message-ID: <5525962.1075855679785.JavaMail.evans@thyme>\r\n',
'Date: Wed, 13 Dec 2000 07:04:00 -0800 (PST)\r\n',
'From: phillip.allen@enron.com\r\n',
'To: christi.nicolay@enron.com, james.steffes@enron.com, jeff.dasovich@enron.com, \r\n',
'\tjoe.hartsoe@enron.com, mary.hain@enron.com, pallen@enron.com,\r\n',
'\tpkaufma@enron.com, richard.sanders@enron.com, \r\n',
'\trichard.shapiro@enron.com, stephanie.miller@enron.com, \r\n',
'\tsteven.kean@enron.com, susan.mara@enron.com, \r\n',
'\trebecca.cantrell@enron.com\r\n',
'Subject: \r\n',
'Mime-Version: 1.0\r\n']

m_dict = {}

for m in m_list:
    m = m.split(':', maxsplit=1)    
    if len(m) > 1:
        key, value = m[0], m[1]
        m_dict[key] = value.strip() 
    else:
        m_dict['To'] = m_dict['To'] + ' ' + m[0].strip()

print(m_dict)

Вывод:
{'Message-ID': '<5525962.1075855679785.JavaMail.evans@thyme>', 'Date': 'Wed, 13 Dec 2000 07:04:00 -0800 (PST)', 'From': 'phillip.allen@enron.com', 'To': 'christi.nicolay@enron.com, james.steffes@enron.com, jeff.dasovich@enron.com, joe.hartsoe@enron.com, mary.hain@enron.com, pallen@enron.com, pkaufma@enron.com, richard.sanders@enron.com, richard.shapiro@enron.com, stephanie.miller@enron.com, steven.kean@enron.com, susan.mara@enron.com, rebecca.cantrell@enron.com', 'Subject': '', 'Mime-Version': '1.0'}

0 голосов
/ 10 октября 2018

Думаю, это будет гораздо более простым и понятным решением для вашей проблемы-

  arr=['Message-ID: <5525962.1075855679785.JavaMail.evans@thyme>\r\n',
'Date: Wed, 13 Dec 2000 07:04:00 -0800 (PST)\r\n',
'From: phillip.allen@enron.com\r\n',
'To: christi.nicolay@enron.com, james.steffes@enron.com, jeff.dasovich@enron.com, \r\n',
'\tjoe.hartsoe@enron.com, mary.hain@enron.com, pallen@enron.com,\r\n',
'\tpkaufma@enron.com, richard.sanders@enron.com, \r\n',
'\trichard.shapiro@enron.com, stephanie.miller@enron.com, \r\n',
'\tsteven.kean@enron.com, susan.mara@enron.com, \r\n',
'\trebecca.cantrell@enron.com\r\n',
'Subject: \r\n',
'Mime-Version: 1.0\r\n']

reqd_array=[]
k=""

for i in arr:
    if ':' in i:
        reqd_array.append(i.strip())
    else:
        k=k+i.strip()
for i,j in enumerate(reqd_array):
    if j.startswith("To:"):
        reqd_array[i]=reqd_array[i]+k
        break
print(reqd_array)        
...