这是一个选项:
from collections import Counter
c = Counter()
s = 'AAABBBCAB'
psum = []
for char in s:
c.update(char)
psum.append(dict(c))
# [{'A': 1}, {'A': 2}, {'A': 3}, {'A': 3, 'B': 1}, {'A': 3, 'B': 2},
# {'A': 3, 'B': 3}, {'A': 3, 'B': 3, 'C': 1}, {'A': 4, 'B': 3, 'C': 1},
# {'A': 4, 'B': 4, 'C': 1}]
我使用collections.Counter 来保持“运行总和”并将(结果的副本)添加到列表psum。这样我只在字符串s上迭代一次。
如果您希望在结果中包含 collections.Counter 对象,您可以将最后一行更改为
psum.append(c.copy())
为了得到
[Counter({'A': 1}), Counter({'A': 2}), ...
Counter({'A': 4, 'B': 4, 'C': 1})]
同样的结果也可以通过这个来实现(使用accumulate 是第一次提出in Eugene Yarmash's answer;我只是避免map 支持生成器表达式):
from itertools import accumulate
from collections import Counter
s = "AAABBBCAB"
psum = list(accumulate(Counter(char) for char in s))
只是为了完整性(因为这里还没有“纯dict”的答案)。如果您不想使用Counter 或defaultdict,您也可以使用它:
c = {}
s = 'AAABBBCAB'
psum = []
for char in s:
c[char] = c.get(char, 0) + 1
psum.append(c.copy())
虽然defaultdict 通常比dict.get(key, default) 性能更高。