2

我对编程相当陌生,并且一直在开发一个程序来计算 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()
4

2 回答 2

3

使用while countValue<=9:. 你用了一个>=.

于 2012-10-31T17:46:29.557 回答
1

而不是 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 倍以上。

于 2012-10-31T18:30:19.863 回答