2016-02-23 5 views
-1

Я сталкивался с некоторыми проблемами с кодом. И меня поразило, в частности. 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 

Любой, у кого больше опыта, можно увидеть лучший способ получить сумму?

+6

Если вы ищете обзор кода, вы можете принять его в [обзор кода SE] (http://codereview.stackexchange.com/) – idjaw

ответ

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

При использовании карты:

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

приятное решение! – MaxU

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 для сравнения).

+0

Вы проверили свой выход ??? – MaxU

+0

@MaxU: Да, это дает 6, 19, 14, 114, 137 – nsilent22

+0

это дает мне: 2165.9259259259325, 3608.76543209879, 3614.3209876543456, 10922.962962953508, 9480.123456823116 (в Python 3.5.1) – MaxU

Смежные вопросы