Python中的数字出现计数器

Python中的数字出现计数器,python,algorithm,python-3.x,Python,Algorithm,Python 3.x,我对编程相当陌生,一直在编写一个程序来计算从0到9的每个值在一个数字字符串中出现的次数(这个程序必须使用一个函数和调用它的主函数)。如果用户输入数字123512378,我希望它告诉我1发生2次2发生2次。。。8出现1次等。现在我正在尝试将一个字符串传递到函数中,然后返回一个按顺序出现次数的列表。然而,我的只是返回我在开始时生成的空列表。这是我的密码: def countdigits(aString,Result): countValue=0 while countValue>=9:

我对编程相当陌生,一直在编写一个程序来计算从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()

使用
而countValue=
使用
而countValue=
而不是只使用

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})
0.106333017349
0.952333927155
输出:

defaultdict(<type 'int'>, {'1': 1, '3': 1, '2': 1, '5': 1, '4': 1, '7': 1, '6': 1, '9': 1, '8': 1})
0.106333017349
0.952333927155

第二个版本的速度要慢9倍以上。

而不是当您可以使用

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})
0.106333017349
0.952333927155
输出:

defaultdict(<type 'int'>, {'1': 1, '3': 1, '2': 1, '5': 1, '4': 1, '7': 1, '6': 1, '9': 1, '8': 1})
0.106333017349
0.952333927155

第二个版本的速度慢了9倍多。

哈哈哈,非常感谢,我已经读了无数遍了,并且一直在阅读>,虽然还不太好,但对范围(10)中的countValue使用
。也谢谢,我想for循环在这里会更符合逻辑。哈哈哈,非常感谢,我对此进行了无数次检查,并一直在阅读>,但效果不太好,请使用范围(10)中的countValue的
。也谢谢您,我想在这里使用for循环更符合逻辑。您也可以使用
集合。Counter
,它可以完成所有这些操作。您还可以使用
集合。Counter
,它可以完成所有这些操作。