<p>而不是你可以用</p>
<pre><code>for i in range(10):
Result[i]=(aString.count(str(i)))
</code></pre>
<p>或者干脆</p>
^{pr2}$
<p>但这看起来是一种非常有效的方法(<strong>请参阅下面的编辑</strong>),您将循环10次(收敛计数将不得不搜索整个字符串),但你可以通过循环一次,然后边走边数来计数</p>
<pre><code>import collections
def countdigits(aString):
count_map = collections.defaultdict(int)
for c in aString:
count_map[c] += 1
return count_map
print countdigits("123456789")
</code></pre>
<p>输出:</p>
<pre><code>defaultdict(<type 'int'>, {'1': 1, '3': 1, '2': 1, '5': 1, '4': 1, '7': 1, '6': 1, '9': 1, '8': 1})
</code></pre>
<p>如果你想的话,它可以很容易地转换成类似<code>Result</code>的数组,但我看不出这有什么好处</p>
<p>编辑:
看起来第二个版本应该很快,因为它循环一次,但不是,<code>list.count</code>是用C语言编写的,速度非常快,可以进行快速搜索,但是python中的循环太慢了,所以timeit会显示谁才是真正的赢家</p>
<pre><code>import collections
def countdigits1(aString):
return [aString.count(str(i)) for i in range(10)]
def countdigits2(aString):
count_map = collections.defaultdict(int)
for c in aString:
count_map[c] += 1
return count_map
import timeit
text = "0123456789"*10
print timeit.timeit('countdigits1("%s")'%text, setup="from __main__ import countdigits1",
number=10000)
print timeit.timeit('countdigits2("%s")'%text, setup="from __main__ import countdigits2",
number=10000)
</code></pre>
<p>输出:</p>
<pre><code>0.106333017349
0.952333927155
</code></pre>
<p>第二个版本慢了9倍多。在</p>