2013-03-13 53 views
5

Vấn đề là: Có danh sách tên và danh sách danh sách, cách tạo danh sách, trong đó mỗi mục là từ điển được đặt hàng có tên là khóa và các mục từ danh sách danh sách dưới dạng giá trị? Nó có thể là rõ ràng hơn từ mã bên dưới:Cách đặt từ điển theo thứ tự từ danh sách các danh sách?

from collections import OrderedDict 

list_of_lists = [ 
       ['20010103', '0.9507', '0.9569', '0.9262', '0.9271'], 
       ['20010104', '0.9271', '0.9515', '0.9269', '0.9507'], 
       ['20010105', '0.9507', '0.9591', '0.9464', '0.9575'], 
       ] 

names = ['date', 'open', 'high', 'low', 'close'] 

Tôi muốn nhận được:

ordered_dictionary = [ 
        OrderedDict([('date', '20010103'), ('open', '0.9507'), ('high', '0.9569'), ('low', '0.9262'), ('close', '0.9271')]), 
        OrderedDict([('date', '20010104'), ('open', '0.9271'), ('high', '0.9515'), ('low', '0.9269'), ('close', '0.9507')]), 
        OrderedDict([('date', '20010105'), ('open', '0.9507'), ('high', '0.9591'), ('low', '0.9464'), ('close', '0.9575')]), 
        ] 

Trả lời

10

Sử dụng zip() để kết hợp các tên và các giá trị. Với một danh sách hiểu:

from collections import OrderedDict 

ordered_dictionary = [OrderedDict(zip(names, subl)) for subl in list_of_lists] 

mang đến cho:

>>> from pprint import pprint 
>>> pprint([OrderedDict(zip(names, subl)) for subl in list_of_lists]) 
[OrderedDict([('date', '20010103'), ('open', '0.9507'), ('high', '0.9569'), ('low', '0.9262'), ('close', '0.9271')]), 
OrderedDict([('date', '20010104'), ('open', '0.9271'), ('high', '0.9515'), ('low', '0.9269'), ('close', '0.9507')]), 
OrderedDict([('date', '20010105'), ('open', '0.9507'), ('high', '0.9591'), ('low', '0.9464'), ('close', '0.9575')])] 
+0

Cảm ơn bạn! Giải pháp rõ ràng và thanh lịch! – atman

0

Tôi biết câu hỏi này là rất cũ, nhưng tôi nghĩ rằng tôi muốn đề nghị một giải pháp namedtuple như một thay thế cho OrderedDict rằng sẽ làm việc tốt trong tình trạng này:

from collections import namedtuple 

Bar = namedtuple('Bar', ['date', 'open', 'high', 'low', 'close']) 

bars = [Bar(date, o, h, l, c) for date, o, h, l, c in list_of_lists] 

>>> bars 
[Bar(date='20010103', open='0.9507', high='0.9569', low='0.9262', close='0.9271'), 
Bar(date='20010104', open='0.9271', high='0.9515', low='0.9269', close='0.9507'), 
Bar(date='20010105', open='0.9507', high='0.9591', low='0.9464', close='0.9575')] 

>>> bars[2].date 
'20010105' 

>>> bars[2].close 
'0.9575' 

Thậm chí tốt hơn, người ta có thể sử dụng sự hiểu biết từ điển với ngày là chìa khóa:

Bar = namedtuple('Bar', ['open', 'high', 'low', 'close']) 

bars = {date: Bar(o, h, l, c) for date, o, h, l, c in list_of_lists} 

>>> bars 
{'20010103': Bar(open='0.9507', high='0.9569', low='0.9262', close='0.9271'), 
'20010104': Bar(open='0.9271', high='0.9515', low='0.9269', close='0.9507'), 
'20010105': Bar(open='0.9507', high='0.9591', low='0.9464', close='0.9575')} 

>>> bars['20010105'] 
Bar(open='0.9507', high='0.9591', low='0.9464', close='0.9575') 

>>> bars['20010105'].close 
'0.9575' 
Các vấn đề liên quan