2014-12-07 27 views
-2

我想在python如何從嵌套字典更改爲平面數組?

之前更改此:

{'NewYork': {'Paris': 12, 'Hawaii': 8, 'Tokyo': 11, 'Incheon': 12, 'LA': 2}, 
'Beijing': {'Hongkong': 3, 'Cebu': 5}, 
'Incheon': {'Cairo': 10, 'LA': 11, 'Tokyo': 1}, 
'Tokyo': {'NewYork': 12, 'Paris': 14, 'LA': 9}} 

後:

[("NewYork","Paris",12), 
("NewYork","Hawaii",8), 
("Newyork","Tokyo",11), 
("NewYork","Incheon",12), 
("NewYork","LA",2), 
("Beijing","HongKong",3), 
("Beijing","Cebu",5), 
("Incheon","Cairo",10), 
("Incheon","LA",11), 
("Incheon","Tokyo",1), 
("Tokyo","NewYork",12), 
("Tokyo","Paris",14), 
("Tokyo","LA",9)] 

我怎樣才能做到這一點?

+0

你確定你的最終格式?你想要一個_list_還是你想要一個帶有列表的_tuple_? – 2014-12-07 05:51:40

回答

0

這將這樣的伎倆:

dict.items() 
1
>>> before = {'NewYork': {'Paris': 12, 'Hawaii': 8, 'Tokyo': 11, 'Incheon': 12, 'LA': 2}, 
...   'Beijing': {'Hongkong': 3, 'Cebu': 5}, 'Incheon': {'Cairo': 10, 'LA': 11, 'Tokyo': 1}, 
...   'Tokyo': {'NewYork': 12, 'Paris': 14, 'LA': 9}} 
>>> 
>>> print [(key,k,v) for key,val in before.iteritems() for k,v in val.iteritems()] 

[('NewYork', 'Paris', 12), ('NewYork', 'LA', 2), ('NewYork', 'Hawaii', 8), ('NewYork', 'Incheon', 12), ('NewYork', 'Tokyo', 11), ('Beijing', 'Hongkong', 3), ('Beijin 
g', 'Cebu', 5), ('Incheon', 'Cairo', 10), ('Incheon', 'Tokyo', 1), ('Incheon', 'LA', 11), ('Tokyo', 'NewYork', 12), ('Tokyo', 'Paris', 14), ('Tokyo', 'LA', 9)] 
1

您可以創建一個list comprehension和兩批迭代的數組:

>>> city_pairings = {'NewYork': {'Paris': 12, 
...        'Hawaii': 8, 
...        'Tokyo': 11, 
...        'Incheon': 12, 
...        'LA': 2}, 
...     'Beijing': {'Hongkong': 3, 
...        'Cebu': 5}, 
...     'Incheon': {'Cairo': 10, 
...        'LA': 11, 
...        'Tokyo': 1}, 
...     'Tokyo': {'NewYork': 12, 
...       'Paris': 14, 
...       'LA': 9}} 

>>> flat = [(city, other_city, value) 
...   for city, pairings in city_pairings.iteritems() 
...   for other_city, value in pairings.iteritems()] 

>>> from pprint import pprint 
>>> pprint(flat) 
[('NewYork', 'Paris', 12), 
('NewYork', 'LA', 2), 
('NewYork', 'Hawaii', 8), 
('NewYork', 'Incheon', 12), 
('NewYork', 'Tokyo', 11), 
('Beijing', 'Hongkong', 3), 
('Beijing', 'Cebu', 5), 
('Incheon', 'Cairo', 10), 
('Incheon', 'Tokyo', 1), 
('Incheon', 'LA', 11), 
('Tokyo', 'NewYork', 12), 
('Tokyo', 'Paris', 14), 
('Tokyo', 'LA', 9)] 

第二個城市是不完全的按照某種方案,字典對它們進行排序,然後按順序排序。要將城市按順序插入詞典,您必須執行其他操作,例如使用OrderedDict