2015-11-30 4 views
1

Мне нужна сумма в строковых буквах значение ex. а = 1 Ь = 2 с = 3 д = 4python3 sum in stings каждое значение буквы

alphabet = 'abcdefghijklmnopqrstuvwxyz' 

v1 

string = "abcd" 

# #result = sum(string) so 
if string[0] and string[1] and string[2] and string[3] in alphabet: 
    if string[0] is alphabet[0] and string[1] is alphabet[1] and string[2] is alphabet[2] and string[3] is alphabet[3]: 
     print(a+b+c+d) 

v2 

string = ("ab","aa","dc",) 

if string[0][0] and string[0][1] and string[1][0] and string[1][1] and string[2][0] and string[2][1] in alphabet: 
    if string[0] is alphabet[0] and string[1] is alphabet[1] and string[2] is alphabet[2] and string[3] is alphabet[3]: 
     print(a+b+c+d) 

что такое решение? вы можете помочь мне

+2

Ваша Булева логика полностью о ff-base, см. [Как проверить одну переменную на несколько значений?] (https://stackoverflow.com/q/15112125) –

ответ

2

Использовать sum() function и generator expression; словарь построен из string.ascii_lowercase может служить средством для получения целого значения на одну букву:

from string import ascii_lowercase 

letter_value = {c: i for i, c in enumerate(ascii_lowercase, 1)} 
wordsum = sum(letter_value.get(c, 0) for c in word if c) 

enumerate(ascii_lowercase, 1) производит (index, letter) пары при итерации, начиная с 1. Это дает вам (1, 'a'), (2, 'b') и т.д. Это может быть преобразован в c: i буквенные пары в словаре, сопоставляя буква с целым числом.

Далее, используя dict.get() method, вы можете выбрать значение по умолчанию; для любого символа во входной строке вы можете найти числовое значение и сопоставить его с целым числом, но если символ не является строчной буквой, вместо него возвращается 0. Часть sum(...) с петлей затем просто добавляет эти значения вверх.

Если вам нужно поддерживать последовательности со словами, просто используйте sum(). Помещенный выше sum() вызова в функции, и применять эту функцию для каждого слова в последовательности:

from string import ascii_lowercase 

letter_value = {c: i for i, c in enumerate(ascii_lowercase, 1)} 

def sum_word(word): 
    return sum(letter_value.get(c, 0) for c in word if c) 

def sum_words(words): 
    return sum(sum_word(word) for word in words) 
+0

Я бы использовал '{chr (i + 96): i для i в диапазоне (1, 27)} 'вместо импорта' ascii_lowercase' –

+0

@StevenSummers: это вопрос вкуса; Я думаю, что это самодокументируется. –

+0

@MartijnPieters ты мой герой – PyDroid

2

Старомодный способ воспользоваться тем, что строчные буквы являются смежными, так что ord(b) - ord(a) == 1:

data = "abcd" 
print("Sum:", sum(ord(c)-ord("a")+1 for c in data)) 

конечно, вы могли бы «оптимизировать» это, чтобы уменьшить количество вычислений, хотя это кажется глупым в этом случае:

ord_a = ord("a") 
print("Sum:", sum(ord(c)-ord_a for c in data)+len(data)) 
+0

спасибо alex, вы можете мне помочь, как получить производственную строку? ех. если у меня есть сумма a + b + c + d, чем мне нужна сумма и произведение, если a + b + c + d! = a * b * c * d – PyDroid

+0

Я googled «продукт python» и [boom!] (http: //stackoverflow.com/a/7948307/699305). Второй хит в результатах Google показывает, как это сделать.(Определите это как показано, затем используйте 'prod()' вместо 'sum()'.) – alexis