<p>我在你的字典里增加了一个关键字,只是为了使解决办法更清楚一点。这是我的意见。在</p>
<pre><code>t = {('A002', 'R051', '02-00-00', 'LEXINGTON AVE'): [[datetime.datetime(2015, 6, 20, 0, 0),
750],
[datetime.datetime(2015, 6, 21, 0, 0),
576],
[datetime.datetime(2015, 6, 22, 0, 0),
1486],
[datetime.datetime(2015, 6, 23, 0, 0),
595],
[datetime.datetime(2015, 6, 24, 0, 0),
841],
[datetime.datetime(2015, 6, 25, 0, 0),
1072],
[datetime.datetime(2015, 6, 26, 0, 0),
1049]],
('A002', 'R051', '02-00-01', 'LEXINGTON AVE'): [[datetime.datetime(2015, 6, 20, 0, 0),
670],
[datetime.datetime(2015, 6, 21, 0, 0),
457],
[datetime.datetime(2015, 6, 22, 0, 0),
1189],
[datetime.datetime(2015, 6, 23, 0, 0),
505],
[datetime.datetime(2015, 6, 24, 0, 0),
665],
[datetime.datetime(2015, 6, 25, 0, 0),
354],
[datetime.datetime(2015, 6, 26, 0, 0),
651]],
('A002', 'R051', '02-00-01', 'LEXINGTON LANE'): [[datetime.datetime(2015, 6, 20, 0, 0),
670],
[datetime.datetime(2015, 6, 21, 0, 0),
457],
[datetime.datetime(2015, 6, 22, 0, 0),
1189],
[datetime.datetime(2015, 6, 23, 0, 0),
505],
[datetime.datetime(2015, 6, 24, 0, 0),
665],
[datetime.datetime(2015, 6, 25, 0, 0),
354],
[datetime.datetime(2015, 6, 26, 0, 0),
651]]}
</code></pre>
<p>现在,你可以这样做了。在</p>
^{pr2}$
<p>这将对字典的键进行排序并返回对列表。每对中的第一项将是新的唯一键(3元组),第二项将是一个迭代器,它为您提供适合此“组”的所有原始键。现在你可以这样“压缩”字典了</p>
^{3}$
<p>这基本上是从组列表中提取每一对。对于每一对,它使用第一个元素作为键(k1),并使用<code>sum</code>将{<cd2>}中的所有条目组合到一个列表中,这些条目具有映射到<code>k1</code>的键。这就是<code>t[k2] for k2 in v</code>。<code>sum</code>只是将所有这些合并到一个列表中。在</p>
<p>这是结果。在</p>
<pre><code>{('A002', 'R051', 'LEXINGTON AVE'): [[datetime.datetime(2015, 6, 20, 0, 0),
750],
[datetime.datetime(2015, 6, 21, 0, 0),
576],
[datetime.datetime(2015, 6, 22, 0, 0),
1486],
[datetime.datetime(2015, 6, 23, 0, 0),
595],
[datetime.datetime(2015, 6, 24, 0, 0),
841],
[datetime.datetime(2015, 6, 25, 0, 0),
1072],
[datetime.datetime(2015, 6, 26, 0, 0),
1049],
[datetime.datetime(2015, 6, 20, 0, 0),
670],
[datetime.datetime(2015, 6, 21, 0, 0),
457],
[datetime.datetime(2015, 6, 22, 0, 0),
1189],
[datetime.datetime(2015, 6, 23, 0, 0),
505],
[datetime.datetime(2015, 6, 24, 0, 0),
665],
[datetime.datetime(2015, 6, 25, 0, 0),
354],
[datetime.datetime(2015, 6, 26, 0, 0),
651]],
('A002', 'R051', 'LEXINGTON LANE'): [[datetime.datetime(2015, 6, 20, 0, 0),
670],
[datetime.datetime(2015, 6, 21, 0, 0),
457],
[datetime.datetime(2015, 6, 22, 0, 0),
1189],
[datetime.datetime(2015, 6, 23, 0, 0),
505],
[datetime.datetime(2015, 6, 24, 0, 0),
665],
[datetime.datetime(2015, 6, 25, 0, 0),
354],
[datetime.datetime(2015, 6, 26, 0, 0),
651]]}
</code></pre>
<p>现在,我们需要使用日期组合这些值。我们可以写一个简单的函数<code>combine</code>,如下所示</p>
<pre><code>def combine(l):
t = itertools.groupby(sorted(l, key=lambda v:v[0]), lambda v:v[0])
return [[k,sum(m[1] for m in v)] for k,v in t]
</code></pre>
<p>这在一个包含2个元组的列表中重复上述过程。它按第一个元素分组,然后将子组的第二个元素求和到一个列表中。在</p>
<p>最后,为了得到最终列表,您可以简单地将<code>combine</code>映射到<code>compressed</code>字典的所有值</p>
<pre><code>final = {k:combine(v) for k,v in compressed.iteritems()}
</code></pre>
<p>这是结果</p>
<pre><code>pprint.pprint(final)
{('A002', 'R051', 'LEXINGTON AVE'): [[datetime.datetime(2015, 6, 20, 0, 0),
1420],
[datetime.datetime(2015, 6, 21, 0, 0),
1033],
[datetime.datetime(2015, 6, 22, 0, 0),
2675],
[datetime.datetime(2015, 6, 23, 0, 0),
1100],
[datetime.datetime(2015, 6, 24, 0, 0),
1506],
[datetime.datetime(2015, 6, 25, 0, 0),
1426],
[datetime.datetime(2015, 6, 26, 0, 0),
1700]],
('A002', 'R051', 'LEXINGTON LANE'): [[datetime.datetime(2015, 6, 20, 0, 0),
670],
[datetime.datetime(2015, 6, 21, 0, 0),
457],
[datetime.datetime(2015, 6, 22, 0, 0),
1189],
[datetime.datetime(2015, 6, 23, 0, 0),
505],
[datetime.datetime(2015, 6, 24, 0, 0),
665],
[datetime.datetime(2015, 6, 25, 0, 0),
354],
[datetime.datetime(2015, 6, 26, 0, 0),
651]]}
</code></pre>
<p>虽然我很喜欢itertools简洁明了,但非琐碎的表达通常都能摆脱我有限的大脑的限制。我经常把事情分解成这样的多个表达式,这样更容易阅读、理解和调试。在</p>
<p>所以,最后,您可以通过下面的代码来完成整个任务。在</p>
^{8}$
<p>从效率的角度看,我不喜欢这样的解决方案。它对键和值进行多次迭代。也许您可以在获得各种元素时将它们保存在更合适的数据结构中。e、 日期时间对象和值的列表可以是一个<code>collections.Counter</code>,键是日期时间,值是数字。在</p>