2014-10-06 3 views
1
d = { 
    'a': [1, 2, 3], 
    'b': [4, 5, 6] 
} 

def magic_fun(d): 
    ?? 

magic_fun(d) -> 
[[('a', 1), ('a', 2), ('a', 3)], 
[('b', 4), ('b', 5), ('b', 6)]] 

Заменить ?? с компрессией списка с одним слоем python. Это выполнимо?python unpacked dictionary of list

Если я это сделать:

>>> [(key, value) for key, values in d.iteritems() for value in values] 
[('a', 1), ('a', 2), ('a', 3), ('b', 4), ('b', 5), ('b', 6)] 

Но я освобождаю первый уровень списка. Все сплющено ...

PS: Это не очень полезно для меня, я мог бы сделать это для цикла, но я удивлен, что не могу найти способ сделать это со списком. .

ответ

4
def magic_fun(d): 
    return [[(key,el) for el in value] for key,value in d.items()] 
    # for key,value in d.items(): 
    #  element_list = [] 
    #  for el in value: 
    #   element_list.append((key,el)) 
    #  yield element_list 
+1

Сэр, это действительно так. –