2013-11-22 3 views
1

у меня есть список словарей, которые имеют в качестве своих значений некоторых кортежей:Преобразование вложенных кортежей в вложенные словари

dic1 = { 
    'persuaded ': [[('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')]], 
    'removed ': [[('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]] 
} 

Что мне нужно сделать, чтобы преобразовать вложенные кортежи в словари, так что я могу сравнить он с другими подобными списками впоследствии использует ключи. Идеальный результат будет что-то вроде:

dic2 = { 
    'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}], 
    'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}] 
} 

Я пробовал:

dic2 = {} 
for x, y in dic1_zipped: 
    d.setdefault(x, []).append(y) 

И:

from collections import defaultdict 
dic2= defaultdict(list) 
for n,v in dic1_zipped: 
    fq[n].append(v) 

Но ни идет достаточно глубоко в словаре. Я был бы очень признателен за любые предложения о том, как это решить! Благодаря!

+0

Почему у вас есть лишние квадратные скобки - в dic1 ваше значение представляет собой список из списка кортежей, а в dic2 ваша ценность - это список отдельных словарей. Будет ли лучший результат не быть '{'убежден': {'teacher': 6, 'group': 5, ...}}'? – jonrsharpe

+0

У вас есть список списков кортежей? – rdodev

+0

@rdodev Да, это то, что у меня есть. Как вы думаете, было бы проще, если бы я сгладил его, прежде чем переходить на словарь? – user3008918

ответ

2

следующие вложенные Dict и списочные сделает это за вас:

dic2 = {key: [{k: v} for sublist in value for k, v in sublist] for key, value in dic1.items()} 

Демо:

>>> {key: [{k: v} for sublist in value for k, v in sublist] for key, value in dic1.items()} 
{'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}], 'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}]} 
>>> from pprint import pprint 
>>> pprint(_) 
{'persuaded ': [{'teacher': '6'}, {'group': '5'}, {'man': '5'}, {'girl': '5'}], 
'removed ': [{'apple': '5'}, {'makeup': '4'}, {'trash': '4'}, {'stain': '4'}]} 

Я на самом деле удивлен, что вы не хотите иметь один словарь за значение :

dic2 = {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()} 

который производит:

>>> {key: {k: v for sublist in value for k, v in sublist} for key, value in dic1.items()} 
{'removed ': {'stain': '4', 'trash': '4', 'apple': '5', 'makeup': '4'}, 'persuaded ': {'group': '5', 'teacher': '6', 'man': '5', 'girl': '5'}} 
>>> pprint(_) 
{'persuaded ': {'girl': '5', 'group': '5', 'man': '5', 'teacher': '6'}, 
'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}} 
+0

Пользователь имеет список списков кортежей, поэтому этот wolution не будет работать. – rdodev

+0

@rdodev: Обратите внимание на 'значение [0]' и, самое главное, демо. Он работает отлично. В любом случае я обновил его, чтобы обрабатывать больше подписок сейчас. –

+0

Отлично! Благодаря! – user3008918

2

Если вы избавитесь от ненужного списка упаковки, т.е.

dic1 = {'persuaded ': [('teacher', '6'), ('group', '5'), ('man', '5'), ('girl', '5')], 'removed ': [('apple', '5'), ('makeup', '4'), ('trash', '4'), ('stain', '4')]} 

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

dic2 = dict((k1, dict(v1)) for k1, v1 in dic1.items()) 

Это дает

{'persuaded ': {'girl': '5', 'man': '5', 'group': '5', 'teacher': '6'}, 'removed ': {'apple': '5', 'makeup': '4', 'stain': '4', 'trash': '4'}} 

Который кажется более полезно, чем список однократных словари.

(. Если вы не можете избавиться от дополнительного уровня списков, просто используйте dict(v1[0]))

+0

Действительно, с завершением обертывания, это вызывает элемент последовательности обновления словаря ValueError: словаря № 0, длина которого равна 4; 2 требуется ', потому что' v1' - это список списков кортежей. Вы можете посоветовать OP о том, как заставить ваш код работать даже с упаковкой. –

+0

Спасибо, добавлено уточнение для дополнительного уровня списка – jonrsharpe

Смежные вопросы