2016-02-29 2 views
2

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

Так словарь словарей списков ---> Словарь списков кортежей

Say:

ff = {'one': {'aaa': [1, 2, 3], 'bbb': [3, 4, 5]}, 'two': {'ccc': [3, 2, 1]}} 

в

test = {'one': [('aaa', 1, 2, 3), ('bbb', 3, 4, 5)], 'two': [('ccc', 3, 2, 1)]} 

И это решение я нашел:

test = { k:[tuple(itertools.chain(itertools.repeat(ksub,1),(elements for elements in vsub))) for ksub,vsub in v.items()] for k,v in ff.items() } 

Есть ли более четкий способ сделать это?

+0

я не думаю, что «к» не имеет ничего общего с кортежами – tinySandy

+0

да спасибо за вклад. –

+0

Ваша текущая версия вопроса не имеет различий во вводе и выходе. –

ответ

2

Я бы просто использовать список понимание и конкатенацию для вложенных элементов Dict:

{k: [(nk,) + tuple(nv) for nk, nv in v.iteritems()] for k, v in ff.iteritems()} 

Демо:

>>> ff = {'one': {'aaa': [1,2,3], 'bbb':[3,4,5] }, 'two': {'ccc' : [3,2,1] }} 
>>> {k: [(nk,) + tuple(nv) for nk, nv in v.iteritems()] for k, v in ff.iteritems()} 
{'two': [('ccc', 3, 2, 1)], 'one': [('aaa', 1, 2, 3), ('bbb', 3, 4, 5)]} 
+0

@ Ivan_nn2: и теперь, когда я свободен от лондонских туннелей, рабочий ответ. –

+0

Это, по-видимому, четвертый самый сложный метрополитен в мире ... :) Вот именно ответ, который я искал! –

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