清理挑战答案的提示?加权数字总和

时间:2016-02-23 20:56:29

标签: python sum digits weighted

我一直在经历一些代码挑战。一个人特别震惊我。 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

任何有经验的人都能看到更好的方法来获得总和吗?

3 个答案:

答案 0 :(得分:3)

如果使用map:

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

答案 1 :(得分:2)

for number in raw_data:
    print(sum(i * int(d) for i, d in enumerate(str(number), 1)))

答案 2 :(得分:2)

这可以完全使用数学运算来完成。看看如何生成总和,例如对于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个元素进行比较)。