【问题标题】:How to write a function which takes a string and turns into a single digit? [duplicate]如何编写一个将字符串转换为单个数字的函数? [复制]
【发布时间】:2018-12-13 15:56:02
【问题描述】:

我想编写一个将字符串转换为单个数字的函数。每个字母都有一个数字值,最后,它应该返回字母的总和,但如果它大于 10,它应该取数字的总和,直到找到 0 和 10 之间。例如,如果结果 99 它应该首先取9+9 = 18 那么它应该是 1 + 8 并且最终的答案必须是 9。

def name_numerology(name):

    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    numbers = '1234567891234567891234567812345678912345678912345678'

    toq = list(zip(letters, numbers))
    sie = []
    for i in name:
        if i in letters:
            sie.append(toq[letters.index(i)])
    ruk = []
    for i, k in sie:
        ruk.append(int(k))
    zu = sum(ruk)
    da = [i for i in str(zu)]
    re = [int(i) for i in da]
    return sum(re)

print(name_numerology('rasmuuuuuuuu'))

输出是:

12

我卡在这里

【问题讨论】:

  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 On topichow to ask... the perfect question 在此处申请。 StackOverflow 不是设计、编码、研究或教程资源。但是,如果您遵循您在网上找到的任何资源,进行诚实的编码尝试并遇到问题,那么您将有一个很好的示例可以发布。

标签: python string algorithm function


【解决方案1】:

使用您的代码,我添加了一个 while 循环来返回小于 10 的数字并且不会评估为“无”,它将运行 while 循环,直到满足这些条件:

def name_numerology(name):

    letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    numbers = '1234567891234567891234567812345678912345678912345678'

    toq = list(zip(letters, numbers))
    sie = []
    for i in name:
        if i in letters:
            sie.append(toq[letters.index(i)])
    ruk = []
    for i, k in sie:
        ruk.append(int(k))
    zu = sum(ruk)
    while zu > 10:

        da = [i for i in str(zu)]
        re = [int(i) for i in da]
        zu = sum(re)
        if zu is not None and zu < 10:
            return zu
    return zu # will handle if number is less than 10 prior to while loop, otherwise "None"

print(name_numerology('rasmuuuuuuuu'))
# 3
print(name_numerology('GHKLLLlllllmmmmmmmmmmmmmmmmmmmmmmmmmmmmm'))
# 4
print(name_numerology('A'))
# 1

【讨论】:

    【解决方案2】:

    您的逻辑过于复杂。您可以只考虑小写字母,因为小写和大写的映射是相同的。使用字典而不是列表进行 O(1) 查找。然后使用this O(1) recipe 作为数字根。

    from string import ascii_lowercase
    
    def name_numerology(name):
        letter_num_map = {v: k % 9 + 1 for k, v in enumerate(ascii_lowercase)}
        num = sum(map(letter_num_map.__getitem__, name.casefold()))    
        return (num - 1) % 9 + 1
    
    res = name_numerology('hello')  # 7
    

    可以通过filter + str.isalpha 轻松删除非字母:

    def name_numerology(name):
        letter_num_map = {v: k % 9 + 1 for k, v in enumerate(ascii_lowercase)}
        modified_string = filter(str.isalpha, name.casefold())
        num = sum(map(letter_num_map.__getitem__, modified_string))
        return (num - 1) % 9 + 1
    
    res = name_numerology('hello ? 234 ')  # 7
    

    【讨论】:

    • 赞赏。但是我忘了提到如果输入不是字符串,函数必须处理并且必须将其转换为字符串。此外,它必须是不在我的字母对象中的其他字符。我的函数能够处理这个问题,但我无法完成。
    • @BirkanEmrem,这是一个可以轻松处理的极端情况,请参阅更新。
    【解决方案3】:

    只是rule of nines。更直接的方式:

    import collections
    mapping = collections.defaultdict(int,( (k,int(i)) for k,i in zip(letters,numbers) ) )
    
    def encode(string):
        res=sum( (mapping[c] for c in string) ) % 9 
        return res if res else 9
    
    
    In [14]: encode('rasmuuuuuuuu')
    3
    In [15]: encode('Hello$')
    7
    

    defaultdict 将未知字符映射到 0。

    【讨论】:

    • 对于映射到333 的字符串,正确答案是9,但您的代码将返回0
    • @PH : Oups。谢谢。已编辑。
    【解决方案4】:

    easier ways实现你所需要的,但根据你的例子,你可以使用:

    def name_numerology(name):
    
        letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
        numbers = '1234567891234567891234567812345678912345678912345678'
    
        toq = list(zip(letters, numbers))
        sie = []
        for i in name:
            if i in letters:
                sie.append(toq[letters.index(i)])
        ruk = []
        for i, k in sie:
            ruk.append(int(k))
        zu = sum(ruk)
        da = [i for i in str(zu)]
        re = [int(i) for i in da]
        if len(str(sum(re))) == 2:
            return int(str(sum(re))[0]) + int(str(sum(re))[1])
        else:
            return int(str(sum(re)))
    
    print(name_numerology('rasmuuuuuuuu'))
    # 3
    

    Python Demo

    【讨论】:

      猜你喜欢
      • 2014-08-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2018-07-05
      • 2017-10-01
      • 2019-06-17
      相关资源
      最近更新 更多