Làm thế nào tôi có thể giải quyết nó:
Thứ nhất, tôi sẽ nhận được cho mỗi chủ chốt một danh sách chứa các bộ dữ liệu, trong đó mục đầu tiên sẽ là khóa và mục thứ hai sẽ là một trong các giá trị từ danh sách:
>>> [ [ (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)]]
Sau đó, tôi sẽ ngang danh sách này, tạo ra một danh sách các hàng chứa mỗi phím tương ứng, sử dụng chức năng zip:
>>> 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))]
Những danh sách con có thể thông qua như là tham số để các nhà xây dựng 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}]
Tuy nhiên, trong thực tế, tôi sẽ không bao giờ đề xuất một người làm một việc như vậy chỉ trong một dòng duy nhất:
>>> 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}]
Thực ra, tôi wo uld nói rằng tôi đã đăng câu trả lời này chủ yếu là để đề xuất bạn chia giải pháp của mình thành nhiều dòng.
+1 để xây dựng từng bước. Cách tiếp cận của chúng tôi giống nhau ngoại trừ việc tôi đã sử dụng rộng rãi 'bản đồ' :) – qiao
@qiao có, chúng tôi đã áp dụng cùng một cách tiếp cận theo cách trừu tượng hơn. Tôi chỉ có một số ưu tiên cho việc hiểu danh sách nhưng giải pháp của bạn là tuyệt vời. – brandizzi