2012-01-19 6 views
1

У меня есть некоторые проблемы с моей функцией.Из словаря в словарь

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

myDictList = [{'id': 55, 'sigla': 'SNG'}, {'id': 62, 'sigla': 'TRP'}, 
{'id': 71, 'sigla': 'PCNIM'}, {'id': 72, 'sigla': 'pc2ni'}, 
{'id': 73, 'sigla': 'ccas'}, {'id': 74, 'sigla': 'ased1'}, 
{'id': 75, 'sigla': '131s'}, {'id': 76, 'sigla': 'r888'}, 
{'id': 56, 'sigla': 'DBL'}] 

id является уникальным (для SQL ограничения).

Я построить список id таким образом

r_id_list = list(rid['id'] for rid in roomList) 

Теперь, я бы построить Dict. как и от myDictList:

{55:'SNG',62:'TRP',71:'PCNIM'.... and so on} 

Более того, я хочу, чтобы избежать части кода так:

finalDict = {} 
for element in myDictList: 
    finalDict.update({element['id']:element['sigla']}) 

Я хочу, чтобы сделать это по ряду причин:

  • Я не» t хочу сделать два отдельных запроса, чтобы получить некоторые данные, которые я могу извлечь с помощью одного
  • Я не хочу перебирать каждый элемент списка для извлечения sigla значение из r_id_list элемента

Некоторые предложения для компактного кода, который не будет включать в себя for цикл внутри for цикла и увеличить сложность?

ответ

5
finalDict = dict([(k['id'], k['sigla']) for k in myDictList]) 

EDIT1 Как комментарий упоминалось, это будет лучший способ сделать это.

finalDict = dict(((k['id'], k['sigla']) for k in myDictList)) 

EDIT2

finalDict = dict((k['id'], k['sigla']) for k in myDictList) 
+1

Удалите внешние квадратные скобки, и это идеально. – eumiro

+0

спасибо, что работает. Когда я попытался сделать что-то подобное, но без '[(k ['id'], k ['sigla'])' (я делаю что-то вроде 'k ['id']: k ['sigla'] '). Теперь я понял. – DonCallisto

+2

@lucemia - Я имел в виду «удалить», а не «заменить круглыми скобами». – eumiro

3

Использование ДИКТ() конструктор с выражением генератора:

finalDict = dict((elem['id'], elem['sigla']) for elem in myDictList) 
2
finaldict = {k['id']: k['sigla'] for k in myDictList} 

, если вы находитесь на текущей версии Python. Словарь постижения были введены в Python 3 и портированный в Python 2.7:

Python 2.7.2 (default, Jun 12 2011, 14:24:46) [MSC v.1500 64 bit (AMD64)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> myDictList = [{'id': 55, 'sigla': 'SNG'}, {'id': 62, 'sigla': 'TRP'}, 
... {'id': 71, 'sigla': 'PCNIM'}, {'id': 72, 'sigla': 'pc2ni'}, 
... {'id': 73, 'sigla': 'ccas'}, {'id': 74, 'sigla': 'ased1'}, 
... {'id': 75, 'sigla': '131s'}, {'id': 76, 'sigla': 'r888'}, 
... {'id': 56, 'sigla': 'DBL'}] 
>>> {k['id']: k['sigla'] for k in myDictList} 
{71: 'PCNIM', 72: 'pc2ni', 73: 'ccas', 74: 'ased1', 75: '131s', 76: 'r888', 55:'SNG', 56: 'DBL', 62: 'TRP'} 
+0

С python 2.7, который не работает. Я пробовал. Вот в чем причина моего вопроса. – DonCallisto

+0

Работает для меня на Python 2.7.2. Вы использовали именно тот код, который я использую? –

+0

Извините, я солгал вам: '>>> import sys >>> print sys.version 2.4.3 (# 1, Feb 3 2007, 20:05:13) [GCC 4.1.1 (Gentoo 4.1.1-r3)] ' – DonCallisto

0
res_dict = {} 
for i in myDictList: 
    res_dict[i['id']] = i['sigla'] 
+0

Сложности List/dict лучше, так как он более эффективен, лаконичен и еще более pythoinic. – 0xc0de

0

Как и другие уже указывал, что лучший способ, чтобы построить свой окончательный словарь использует выражение в генераторе, как:

finalDict = dict((d['id'], d['sigla']) for d in myDictList) 

И если вам по-прежнему нужен итерируемый над вашими идентификаторами, вы можете просто позвонить finalDict.keys().

1

Рассмотрите возможность сделать шаг назад и взглянуть за пределы узкого круга вопросов. Вы говорите: «Я делаю SQL-запрос, чтобы получить список, содержащий словарь».Что вы используете для выполнения SQL-запроса?

драйверами баз данных Python по умолчанию возвращает tuple для каждой строки, а не dict, так что вы, вероятно есть другой код, который преобразовывая эти кортежи в dict прежде чем вы хотите, чтобы преобразовать их обратно. Лучше всего сделать запрос, который возвращает кортежи, и построить ваш dict непосредственно из этого:

cursor.execute('SELECT id, sigla FROM sometable') 
myDict = dict(cursor.fetchall()) 
+0

У меня есть библиотека «подушек», которую мы писали, где я работаю, и для нас лучше получить дикт. Я не могу переписать этот метод, потому что он используется в широкой области. Я не могу ни перегрузить его, но спасибо за помощь. – DonCallisto

+0

+1 для указания – 0xc0de