而不是 while 你可以使用
for i in range(10):
Result[i]=(aString.count(str(i)))
或者干脆
return [aString.count(str(i)) for i in range(10)]
但这看起来是一种非常低效的方法(请参见下面的编辑),您循环了 10 次(aString.count 必须搜索整个字符串),但是您可以通过只循环一次并在进行时计数来计数,例如
import collections
def countdigits(aString):
count_map = collections.defaultdict(int)
for c in aString:
count_map[c] += 1
return count_map
print countdigits("123456789")
输出:
defaultdict(<type 'int'>, {'1': 1, '3': 1, '2': 1, '5': 1, '4': 1, '7': 1, '6': 1, '9': 1, '8': 1})
如果你想要它可以很容易地转换为数组,Result
但我认为没有任何优势
编辑:看起来第二个版本应该很快,因为它循环一次但它不是,list.count
在 C 中并且超级快并且会进行快速搜索,但是在 python 中循环太慢,所以 timeit 显示谁是真正的赢家
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)
输出:
0.106333017349
0.952333927155
第二个版本慢了 9 倍以上。