【发布时间】:2015-11-02 20:17:23
【问题描述】:
假设您有两个(有序)字典,它们从(字符串)日期映射到十进制数,如下所示:
adata = OrderedDict(
[('2014-01-06', Decimal('14560.810')),
('2014-01-13', Decimal('17867.040')),
('2013-12-30', Decimal('8941.440')),
('2014-02-10', Decimal('17737.630')),
('2014-02-03', Decimal('14450.870')),
('2014-01-20', Decimal('15595.400')),
('2014-02-24', Decimal('6290.760')),
('2014-01-27', Decimal('14619.390'))])
bdata= OrderedDict(
[('2013-01-27', Decimal('12173.170')),
('2012-12-31', Decimal('14447.010')),
('2014-02-24', Decimal('14861.870')),
('2014-02-27', Decimal('861.870'))])
如何根据以下规则将adata 与bdata 合并:
- 按月和日合并,而不是按年合并。
- 如果
adata中的键存在于bdata中,则将bdata[key]的值分配到第二个位置,否则将值分配到那里。 - 返回这个,但按日期排序。
-
Decimals 可以替换为浮点数。
我希望这个输出:
cdata = OrderedDict(
[('2013-12-30', (Decimal('8941.440'), 0)),
('2012-12-31', (0, Decimal('14447.010'))),
('2014-01-06', (Decimal('14560.810'), 0)),
('2014-01-13', (Decimal('17867.040'), 0)),
('2014-01-20', (Decimal('15595.400'), 0)),
('2014-01-27', (Decimal('14619.390'), Decimal('12173.170'))),
('2014-02-03', (Decimal('14450.870'), 0)),
('2014-02-10', (Decimal('17737.630'), 0)),
('2014-02-24', (Decimal('6290.760'), Decimal('14861.870'))),
('2014-02-27', (0, Decimal('861.870'))) ])
我尝试了以下操作,但没有得到我想要的输出。
cdata = OrderedDict()
for key in adata.keys() + bdata.keys():
if not cdata.has_key(key):
try:
val_b = adata[key]
except KeyError:
val_b = 0
try:
val_c = bdata[key]
except KeyError:
val_c = 0
cdata[key] = (val_b, val_c)
【问题讨论】:
-
你得到了什么输出?
-
因为我得到这个
{'2014-01-06': (Decimal('14560.810'), 0), '2014-01-13': (Decimal('17867.040'), 0), '2013-12-30': (Decimal('8941.440'), 0), '2014-02-10': (Decimal('17737.630'), 0), '2014-02-03': (Decimal('14450.870'), 0), '2014-01-20': (Decimal('15595.400'), 0), '2014-02-24': (Decimal('6290.760'), Decimal('14861.870')), '2014-01-27': (Decimal('14619.390'), 0), '2013-01-27': (0, Decimal('12173.170')), '2012-12-31': (0, Decimal('14447.010')), '2014-02-27': (0, Decimal('861.870'))}似乎是正确的(未排序),接受您从输出中排除了您的一个输入。 -
是的,这可能是我忘记了,但它应该按关键日期排序。你能在这里分享你的代码吗?我会检查并告诉你。在 cdata 中查看我的编辑
标签: python date merge ordereddictionary