Создать пары ключ / значение словаря из списка на основе условия

1

Простите меня, если это беспорядок, но я все еще новый. Мне нужно создать новые переменные из данных в электронном письме. Я использую imaplib для чтения электронных писем рабочих билетов на нашем сервере. Я смог вытащить данные, которые мне нужны из электронных писем, но теперь я должен организовать его во что-то полезное. Это код, который я использовал для получения данных;

dataList = []

def parser(data):
    # this will parse the data from ticket and create a list.
    html = data
    parsed = bs(html, "lxml")
    data = [line.strip() for line in parsed.stripped_strings]
    dataList.append(data)


imapUser = "domain\\ticketemailaccount"
imapPassw = "passwordthatisused"
conn = imaplib.IMAP4_SSL('mail.company.com', 993)
try:
    conn.login(imapUser, imapPassw)
except:
    print "##########  SERVER LOGIN ERROR  ##########"
    print sys.exc_info()[1]
    sys.exit(1)

conn.select(readonly=1)
result, data = conn.search(None, '(UNSEEN)')
conn.select("inbox")
ids = data[0].split() #each email has a sequential ID.

for d in ids:
    result, data = conn.fetch(d, "(UID BODY.PEEK[TEXT])")
    raw_email = data[0][1]
    msg = email.message_from_string(raw_email)
    tic = str(msg)
    parser(tic)

for i in dataList:
    ticketNum = i[1] #this is a unique ID for each ticket
    print ticketNum
    print i

Результат этого выглядит так:

181693185
[u'From nobody Mon Jun 18 10:07:54 2018', u'121314151', u'WORK TICKET REQUEST', u'TICKET NUMBER:', u'181694524', u'OLD TICKET NUM:', u'Message Type:', u'Normal', u'For Code:', u'TRUCK1', u'Hours Notice:', u'72', u'Seq Num:', u'10', u'Prepared By:', u'Bob.1234', u'Call Back:', u'Work Information', u'State:', u'ZA', u'Work To Begin:', u'06/21/18 AT 10:00', u'County:', u'SOMECOUNTY', u'Update Date:', u'07/02/18 AT 00:00', u'Place:', u'GOTHAM CITY', u'Extent:', u"Add'l Addr In Remarks:", u'No'] 

У меня есть вопрос: как просмотреть список и создать пары "ключ/значение" из двух элементов, только если первый встреченный элемент заканчивается символом ":", что делает следующий элемент в списке значением только в том случае, если он не закончите с ":"?

Теги:
list
dictionary
imaplib

2 ответа

1
Лучший ответ

Здесь один из способов использования цикла for с zip:

L = [u'From nobody Mon Jun 18 10:07:54 2018', u'121314151', u'WORK TICKET REQUEST', u'TICKET NUMBER:', u'181694524', u'OLD TICKET NUM:', u'Message Type:', u'Normal', u'For Code:', u'TRUCK1', u'Hours Notice:', u'72', u'Seq Num:', u'10', u'Prepared By:', u'Bob.1234', u'Call Back:', u'Work Information', u'State:', u'ZA', u'Work To Begin:', u'06/21/18 AT 10:00', u'County:', u'SOMECOUNTY', u'Update Date:', u'07/02/18 AT 00:00', u'Place:', u'GOTHAM CITY', u'Extent:', u"Add'l Addr In Remarks:", u'No']

d = {}

for i, j in zip(L, L[1:]):
    if i.endswith(':') and not j.endswith(':'):
        d[i] = j

Вы также можете написать это как понимание словаря:

d = {i: j for i, j in zip(L, L[1:]) if i.endswith(':') and not j.endswith(':')}

Результат:

print(d)

{"Add'l Addr In Remarks:": 'No',
 'Call Back:': 'Work Information',
 'County:': 'SOMECOUNTY',
 'For Code:': 'TRUCK1',
 'Hours Notice:': '72',
 'Message Type:': 'Normal',
 'Place:': 'GOTHAM CITY',
 'Prepared By:': 'Bob.1234',
 'Seq Num:': '10',
 'State:': 'ZA',
 'TICKET NUMBER:': '181694524',
 'Update Date:': '07/02/18 AT 00:00',
 'Work To Begin:': '06/21/18 AT 10:00'}
  • 1
    Это прекрасно работает. Спасибо! Ключи, которые не имеют значений, опущены, а остальные пары идеально.
-2

Вы можете сделать следующее с помощью только zip:

l = [u'From nobody Mon Jun 18 10:07:54 2018', u'121314151', u'WORK TICKET REQUEST', u'TICKET NUMBER:', u'181694524', u'OLD TICKET NUM:', u'Message Type:', u'Normal', u'For Code:', u'TRUCK1', u'Hours Notice:', u'72', u'Seq Num:', u'10', u'Prepared By:', u'Bob.1234', u'Call Back:', u'Work Information', u'State:', u'ZA', u'Work To Begin:', u'06/21/18 AT 10:00', u'County:', u'SOMECOUNTY', u'Update Date:', u'07/02/18 AT 00:00', u'Place:', u'GOTHAM CITY', u'Extent:', u"Add'l Addr In Remarks:", u'No']

b = dict(zip(l[::2], l[1::2]))

Выход:

{'From nobody Mon Jun 18 10:07:54 2018': '121314151', 'WORK TICKET REQUEST': 'TICKET NUMBER:', '181694524': 'OLD TICKET NUM:', 'Message Type:': 'Normal', 'For Code:': 'TRUCK1', 'Hours Notice:': '72', 'Seq Num:': '10', 'Prepared By:': 'Bob.1234', 'Call Back:': 'Work Information', 'State:': 'ZA', 'Work To Begin:': '06/21/18 AT 10:00', 'County:': 'SOMECOUNTY', 'Update Date:': '07/02/18 AT 00:00', 'Place:': 'GOTHAM CITY', 'Extent:': "Add'l Addr In Remarks:"}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню