【问题标题】:Number occurrence counter in PythonPython中的数字出现计数器
【发布时间】:2012-11-01 02:41:59
【问题描述】:

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

【问题讨论】:

    标签: python algorithm python-3.x


    【解决方案1】:

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

    【讨论】:

    • 哈哈哈非常感谢,这个我翻了无数遍,一直在看>不如
    • 更好的是,使用for countValue in range(10)
    • 也谢谢你,我想这里的 for 循环会更合乎逻辑
    【解决方案2】:

    而不是你可以只使用

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

    【讨论】:

    • 你也可以使用collections.Counter,它可以做到这一切。
    猜你喜欢
    • 2021-05-22
    • 1970-01-01
    • 2013-09-08
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多