2012-02-06 2 views
2

Я создаю почтовый «бот» для одной из моих веб-сервисов, которая будет периодически собирать очередь сообщений электронной почты, отправляемых с PHP-скрипта, и отправлять их через SMTP-серверы Google. PHP скрипт возвращает сообщения в этом формате:Создание многоуровневого словаря из строки [Python]

[email protected]:Full Name:shortname\[email protected]:Another Full Name:anothershortname\[email protected]:Foo:bar 

мне нужно «преобразовать», что в чем-то вроде этого:

{ 
    "[email protected]": [ 
     [ 
      "Full Name", 
      "shortname" 
     ], 
     [ 
      "Foo", 
      "bar" 
     ] 
    ], 
    "[email protected]": [ 
     [ 
      "Another Full Name", 
      "anothershortname" 
     ] 
    ] 
} 

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

raw = "[email protected]xample.com:Full Name:shortname\[email protected]:Another Full Name:anothershortname\[email protected]:Foo:bar" 

print raw 

newlines = raw.split("\n") 

print newlines 

merged = {} 
for message in newlines: 
    message = message.split(":") 
    merged[message[0]].append([message[1], message[2]]) 

print merged 

Я получаю исключение KeyError на последнюю строку цикла, который я беру, чтобы означать, что ключ должен существовать перед добавлением ничего к ней (добавление к несуществующему ключу будет не создавайте этот ключ).

Я новичок в Python и еще не знаком со списками и словарями, поэтому ваша помощь очень ценится!

+0

+1 за усилия. –

+0

Не указанная структура. –

+0

@ IgnacioVazquez-Abrams - Как я уже сказал, я еще не знаком с словарями и списками; это скорее псевдоструктура (я думаю, что это действительно действительный JSON). Только что-то для меня, чтобы визуализировать. –

ответ

1

Вы указали правильную ошибку. Поэтому вам нужно проверить, присутствует ли ключ. 'key' in dict возвращает True, если 'key' находится в dict, в противном случае False. Реализация этого, вот ваш полный код (с отладочной печати удалены):

raw = "[email protected]:Full Name:shortname\[email protected]:Another Full Name:anothershortname\[email protected]:Foo:bar" 
newlines = raw.split("\n") 
merged = {} 
for message in newlines: 
    message = message.split(":") 
    if message[0] in merged: 
     merged[message[0]].append([message[1], message[2]]) 
    else: 
     merged[message[0]]=[[message[1], message[2]]]  
print merged 

Обратите внимание на дополнительные кронштейны для вложенного списка на второй последней строке.

1

Может работать как:

for message in newlines: 
    message = message.split(":") 
    temp = [] 
    temp.append(message[1]) 
    temp.append(message[2]) 
    merged[message[0]] = temp 

На самом деле, может быть:

for message in newlines: 
    message = message.split(":") 
    temp = [] 
    temp.append(message[1]) 
    temp.append(message[2]) 
    if message[0] not in merged: 
     merged[message[0]] = [] 
    merged[message[0]].append(temp) 
0

Просто проверить на наличие ключа, если его нет, создайте ключ, , если он присутствует, то добавьте данные в существующий список.

if(messsage[0] in merged): 
    merged[message[0]] = [message[1],[message[2]] 
else: 
    merged[message[0]].append([[message[1], message[2]]) 
+0

Несовпадение кронштейна. Во второй строке кода это должно быть '[[сообщение [1], сообщение [2]]]'. –

+0

thanks.corrected. – DhruvPathak

1

Я вижу, что вы уже приняли ответ, но, возможно, вы так или иначе заинтересованы в том, что вы делаете, может быть легко достигнуто с defaultdict:

from collections import defaultdict 
raw = "[email protected]:Full Name:shortname\[email protected]:Another Full Name:anothershortname\[email protected]:Foo:bar" 

merged = defaultdict(list) 
for line in raw.split('\n'): 
    line = line.split(':') 
    merged[line[0]].append(line[1:]) 
Смежные вопросы