Python中的数字发生次数计数器

2024-10-02 02:39:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我对编程相当陌生,一直在编写一个程序来计算从0到9的每个值在一个数字串中出现的次数(这个程序必须使用一个函数和调用它的main函数)。如果用户输入数字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()

Tags: 函数程序列表maindef编程result次数
2条回答

而不是你可以用

for i in range(10): 
    Result[i]=(aString.count(str(i)))

或者干脆

^{pr2}$

但这看起来是一种非常有效的方法(请参阅下面的编辑),您将循环10次(收敛计数将不得不搜索整个字符串),但你可以通过循环一次,然后边走边数来计数

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倍多。在

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

相关问题 更多 >

    热门问题