如何从列表生成有序字典?
问题是:
有一个名字的列表,还有一个列表的列表,如何创建一个新的列表,其中每个项目都是一个有序字典,字典的键是名字,值是来自列表的列表的项目?下面的代码可能会更清楚:
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']
我想得到的是:
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')]),
]
2 个回答
1
我知道这个问题已经很久了,但我想推荐一个用namedtuple
的解决方案,作为OrderedDict的替代方案,这在这种情况下会很好用:
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'
更棒的是,可以用字典推导式,把日期作为键来使用:
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'
11
使用 zip()
函数可以把名字和对应的值组合在一起。你可以用一种叫做列表推导式的方法来实现:
from collections import OrderedDict
ordered_dictionary = [OrderedDict(zip(names, subl)) for subl in list_of_lists]
这样就能得到:
>>> 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')])]