Jak bym go rozwiązać:
Po pierwsze, chciałbym uzyskać dla każdego klawisza listę zawierającą krotki, gdzie pierwszym elementem byłby klucz, a drugi byłby jedną z wartości z listy:
>>> [ [ (k, i) for i in l] for k, l in d.items() ]
[[('I1', 1), ('I1', 3), ('I1', 5), ('I1', 2)],
[('I0', 0), ('I0', 1), ('I0', 5), ('I0', 2)],
[('I2', 5), ('I2', 9), ('I2', 10), ('I2', 1)]]
Wtedy że poprzecznie do tej listy, tworząc listę krotki zawierających każdy odpowiedni klucz, za pomocą funkcji pocztowy:
>>> list(zip(*[ [ (k, i) for i in l] for k, l in d.items() ]))
[(('I1', 1), ('I0', 0), ('I2', 5)),
(('I1', 3), ('I0', 1), ('I2', 9)),
(('I1', 5), ('I0', 5), ('I2', 10)),
(('I1', 2), ('I0', 2), ('I2', 1))]
tych listach podrzędnych może przekazywany jako parametr do konstruktora dict:
>>> [dict(lp) for lp in zip(*[ [ (k, i) for i in l] for k, l in d.items() ])]
[{'I0': 0, 'I1': 1, 'I2': 5},
{'I0': 1, 'I1': 3, 'I2': 9},
{'I0': 5, 'I1': 5, 'I2': 10},
{'I0': 2, 'I1': 2, 'I2': 1}]
W praktyce jednak nigdy nie poleciłbym, aby robił coś takiego w jednej linii:
>>> pairs = [ [ (k, i) for i in l] for k, l in d.items() ]
>>> transversed = zip(*pairs)
>>> ds = [dict(t) for t in transversed]
>>> pprint(ds)
[{'I0': 0, 'I1': 1, 'I2': 5},
{'I0': 1, 'I1': 3, 'I2': 9},
{'I0': 5, 'I1': 5, 'I2': 10},
{'I0': 2, 'I1': 2, 'I2': 1}]
Właściwie to ja Wydaje mi się, że wysłałem tę odpowiedź głównie, aby zaproponować podział rozwiązania na więcej niż jedną linię.
+1 do opracowania krok po kroku. Nasze podejścia są takie same, z wyjątkiem tego, że szeroko wykorzystałem 'map' :) – qiao
@qiao tak, przyjęliśmy to samo podejście w bardziej abstrakcyjny sposób. Po prostu mam pewne preferencje co do rozumienia listy, ale twoje rozwiązanie jest doskonałe. – brandizzi