擅长:python、mysql、java
<p>代码中唯一不清楚的是double for循环。如果将<code>demandlist</code>压缩成一个平坦的iterable,那么loopant将尽可能简单地呈现逻辑。考虑:</p>
<pre><code>demandlist = [{
u'2018-04-29': 1,
u'2018-04-30': 1,
u'2018-05-01': 1
}, {
u'2018-04-21': 1
}, {
u'2018-04-18': 1,
u'2018-04-19': 1,
u'2018-04-17': 1
}]
import itertools as it
from collections import defaultdict
demandresult = defaultdict(int)
for k, v in it.chain.from_iterable(map(lambda d: d.items(), demandlist)):
demandresult[k] = demandresult[k] + v
</code></pre>
<p>(这样,<code>print(demandresult)</code>打印<code>defaultdict(<class 'int'>, {'2018-04-29': 1, '2018-04-30': 1, '2018-05-01': 1, '2018-04-21': 1, '2018-04-18': 1, '2018-04-19': 1, '2018-04-17': 1})</code>。)</p>
<p>想象自己第一次(或几个月后)读到这篇文章,我会想:“好吧,我正在将<code>demandlist</code>压缩成一个key valiterable,我不特别关心如何,然后求出匹配键的值。”</p>
<p>不幸的是,我需要<code>map</code>来确保最后一个iterable具有key-val对……<code>it.chain.from_iterable(demandlist)</code>是一个只包含key的iterable,所以我需要在每个dict上调用<code>items</code></p>
<p>请注意,与许多建议的答案不同,这个实现(就像您的!)尽可能减少对数据的扫描次数,以获得一次性能上的胜利(我尽可能多地获得简单的性能胜利)。在</p>