【问题标题】:Tips for cleaning up a challenge's answer? Weighted Sum of Digits [closed]清理挑战答案的提示?加权数字总和[关闭]
【发布时间】:2016-02-23 20:56:29
【问题描述】:

我一直在经历一些代码挑战。其中一个让我印象特别深刻。 CodeAbbey 有一个加权数字总和挑战。这就是我的答案。

# open and read a file, hardcoded numbers, etc. Here is a sample
raw_data = (6, 19, 64, 6527226, 12345146)  

for number in raw_data:
    wsd = 0  # Stores sum
    number_list = list(str(number))  # Converts the number into a list.
    for i, k in enumerate(number_list):  # Enumerates each number
        wsd += (int(i+1) * int(k))  # Multiplies and adds product to wsd
    print(wsd)

output >>> 6, 19, 14, 114, 137

任何有更多经验的人能够找到更好的方法来获得总和?

【问题讨论】:

  • 如果你正在寻找代码审查,你可能想把它带到code review SE

标签: python sum digits weighted


【解决方案1】:

如果使用地图:

>>> map(lambda d: sum([ (i+1) * int(v) for i,v in enumerate(list(str(d)))]), raw_data)
[6, 19, 14, 114, 137]

【讨论】:

    【解决方案2】:
    for number in raw_data:
        print(sum(i * int(d) for i, d in enumerate(str(number), 1)))
    

    【讨论】:

      【解决方案3】:

      这可以完全使用数学运算来完成。看看总和是如何产生的,例如对于 12345146:

                      6
                    4+6
                  1+4+6
                5+1+4+6
              4+5+1+4+6
            3+4+5+1+4+6
          2+3+4+5+1+4+6
      + 1+2+3+4+5+1+4+6
      

      所以首先你添加最后一个数字,然后是最后一个和上一个,然后是最后一个,上一个和上一个等,直到你添加所有数字。这可以通过以下算法简单实现:

      raw_data = (6, 19, 64, 6527226, 12345146)  
      for d in raw_data:
          wsd = 0
          lst = 0 # this is for holding last 'sum row'
          while d > 0:
              lst = lst + d % 10 # append another digit
              wsd += lst
              d //= 10
          #
          print wsd
      #
      

      在我的计算机上,这比使用枚举和字符串转换的算法快大约两倍(我将 raw_data 乘以 100000 次,从而得到 500000 个元素进行比较)。

      【讨论】:

      • 你检查你的输出了吗???
      • @MaxU:是的,它给出了 6、19、14、114、137
      • 它给了我:2165.9259259259325、3608.76543209879、3614.3209876543456、10922.962962953508、9480.123456823116(在 Python 3.5.1 中)
      • 知道了,你应该用 d //= 10 替换:d /= 10
      • @MaxU:我使用 python 2.7.3。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 2017-01-25
      • 2014-10-07
      相关资源
      最近更新 更多