2017-06-12 130 views
0

我已经编写了用于查找名称的数字值的代码。有什么方法可以缩短代码,或者在另一个循环中嵌套一个循环?numerology ..如何缩短代码..?

alphabets = {"A":1,"I":1,"J":1, "Q":1,"Y":1,"B":2,"K":2,"R":3,"C":3,"G":3,"L":3,"S":3,"D":4,"M":4,"T":4,"H":5,"E":5,"N":5,"X":5,"U":6,"V":6,"W":6,"O":7, "Z":7,"P":8,"F":8} 

word =input("your numerology score is :") #since i am using python 3 to code this 

def digit_sum(n): 
    #prepare a list of numbers in n convert to string and reconvert 
    numbers=[] 
    for digit in str(n): 
     numbers.append(int(digit)) 
    # add up the total of numbers  
    total=0 
    for number in numbers: 
     total += number 
    return total 

def numerology(word): 
     total = 0 
     for letter in word.upper(): 
      total += alphabets[letter] 
      total = digit_sum(total) 

     return total 

print (numerology(word)) 

要理解命理值是什么意思,请参阅https://en.wikipedia.org/wiki/Numerology#Latin_alphabet_systems

+4

也许是更合适的那边:https://codereview.stackexchange.com/?tab=active – Tbaki

回答

2
alphabets = {"A":1,"I":1,"J":1, "Q":1,"Y":1,"B":2,"K":2,"R":3,"C":3,"G":3,"L":3,"S":3,"D":4,"M":4,"T":4,"H":5,"E":5,"N":5,"X":5,"U":6,"V":6,"W":6,"O":7, "Z":7,"P":8,"F":8} 

name = "this is a sample name" 

digits = str(sum([alphabets[l] for l in name.upper() if l in alphabets.keys()])) 

numerological_value = int(digits) % 9 

if numerological_value == 0: 
    numerological_value = 9 

print(numerological_value) 
+0

我试图找出如果这张贴的代码,它调用匹配'digit_sum'一遍遍在一个循环中。但它看起来更像是问题的主意。 – doctorlove

+0

o上帝,它是1行代码..!它花了我几小时写这个..研究..! – niksy

+0

也我的代码只占用一个单词,例如:第一个名称我如何使它需要两个或更多的单词,例如:名字,中间和姓氏 – niksy

2

理解允许您创建各种数据类型。 在这种情况下,你想构建生成器。 这是因为您不需要在减少列表之前将每个数字构建为单个数字。

sum中包裹一个可以让你显着缩短digit_sum。可以变为:

def digit_sum(n): 
    return sum(int(digit) for digit in str(n)) 

如果将加法和赋值结合起来,也可以将命理更改得稍短一些。

def numerology(word): 
    total = 0 
    for letter in word.upper(): 
     total = digit_sum(total + alphabets[letter]) 
    return total 

如果你愿意,你可以使用functools.reduce来使这个跨度共有6行。

def numerology(word): 
    return functools.reduce(
     lambda a, b: sum(int(digit) for digit in str(a + b)), 
     (alphabets[letter] for letter in word.upper()), 
     0 
    )