Python中的数字出现计数器

时间:2012-10-31 17:43:54

标签: python algorithm python-3.x

我对编程很新,并且一直在研究一个程序来计算0-9中每个值出现在一串数字中的次数(这个程序必须使用一个调用它的函数和主函数)。如果用户输入数字123512378,我希望它告诉我1发生2次2发生2次... 8发生1次等现在我正在尝试将字符串传递给函数然后返回一个带有该数字的列表按顺序发生的事件。然而,我只返回我在开始时生成的空列表。这是我的代码:

def countdigits(aString,Result):
  countValue=0
  while countValue>=9:
    Result[countValue]=(aString.count(str(countValue)))
    countValue=countValue+1
  return Result

def main():
  emptyList = 10 * [0]
  numbers=str(input("Pleas enter a string of numbers: "))
  print(countdigits(numbers,emptyList))

main()

2 个答案:

答案 0 :(得分:3)

使用while countValue<=9:。您使用了>=

答案 1 :(得分:1)

而不是在你可以使用

的时候
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倍。