Python代码战争:如何正确减少要添加到新字符串中的零的数量

Python代码战争:如何正确减少要添加到新字符串中的零的数量,python,Python,以下是CodeWar说明: 您将获得一个数字,并且需要将其作为字符串返回 以扩展形式 注意:所有数字都是大于0的整数 这是我的密码 def expanded_form(num): num = list(str(num)) num = [int(i) for i in num] new_string = '' for each in num: if each != 0: a = len(num) - 1

以下是CodeWar说明:

您将获得一个数字,并且需要将其作为字符串返回 以扩展形式

注意:所有数字都是大于0的整数

这是我的密码

def expanded_form(num):
    num = list(str(num))
    num = [int(i) for i in num]

    new_string = ''
    for each in num: 

        if each != 0:
            a = len(num) - 1
            new_string += ('%s' + '0' * a + ' + ') %(each)
            num.pop(0)
        else:
            num.pop(0)

    return new_string[0:len(new_string)-3]
当我运行数字70304的函数时,我期望

70000 + 300 + 4
但我明白了

70000 + 3000 + 400
我认为我的代码将遍历
num
中的每个数字,如果为零,它将再次缩短列表。下一个循环,
a
将生成要附加到数字3和4上的正确数量的零。我做错了什么


编辑:我更改了函数,使其对整数而不是字符串进行操作。但结果仍然相同。

分析

我只在一个地方追踪了你的循环:

对于num中的每一个: a=len(num)-1 打印编号,[每个],a 如果每个都有!=0:
新字符串+=(每个+'0'*a++') num.pop(0)

输出:

['7', '0', '3', '0', '4'] ['7'] 4
['0', '3', '0', '4'] ['3'] 3
['3', '0', '4'] ['4'] 2
70000 + 3000 + 400
['7', '0', '3', '0', '4'] ['7'] 4
['7', '0', '3', '0', '4'] ['0'] 3
['7', '0', '3', '0', '4'] ['3'] 2
['7', '0', '3', '0', '4'] ['0'] 1
['7', '0', '3', '0', '4'] ['4'] 0
70000 + 300 + 4
两个问题:

  • 在迭代过程中更改
    num
    。这对您的迭代是致命的
    每个
    在每次迭代中前进一个位置,因此它将只命中字符串中的偶数位置
  • 每个
    都是一个字符;将其与整数值0进行比较。这仅适用于空字符
  • 修理

    def expanded_form(num):
        num = list(str(num))
        new_string = ''
        for i, each in enumerate(num):
            a = len(num) - (i+1)
            print num, [each], a
            if each != '0':  
                new_string += (each + '0' * a + ' + ')
    
        return new_string[0:len(new_string)-3]
    
    print expanded_form(70304)
    
    输出:

    ['7', '0', '3', '0', '4'] ['7'] 4
    ['0', '3', '0', '4'] ['3'] 3
    ['3', '0', '4'] ['4'] 2
    70000 + 3000 + 400
    
    ['7', '0', '3', '0', '4'] ['7'] 4
    ['7', '0', '3', '0', '4'] ['0'] 3
    ['7', '0', '3', '0', '4'] ['3'] 2
    ['7', '0', '3', '0', '4'] ['0'] 1
    ['7', '0', '3', '0', '4'] ['4'] 0
    70000 + 300 + 4
    

    分析

    我只在一个地方追踪了你的循环:

    对于num中的每一个: a=len(num)-1 打印编号,[每个],a 如果每个都有!=0:
    新字符串+=(每个+'0'*a++') num.pop(0)

    输出:

    ['7', '0', '3', '0', '4'] ['7'] 4
    ['0', '3', '0', '4'] ['3'] 3
    ['3', '0', '4'] ['4'] 2
    70000 + 3000 + 400
    
    ['7', '0', '3', '0', '4'] ['7'] 4
    ['7', '0', '3', '0', '4'] ['0'] 3
    ['7', '0', '3', '0', '4'] ['3'] 2
    ['7', '0', '3', '0', '4'] ['0'] 1
    ['7', '0', '3', '0', '4'] ['4'] 0
    70000 + 300 + 4
    
    两个问题:

  • 在迭代过程中更改
    num
    。这对您的迭代是致命的
    每个
    在每次迭代中前进一个位置,因此它将只命中字符串中的偶数位置
  • 每个
    都是一个字符;将其与整数值0进行比较。这仅适用于空字符
  • 修理

    def expanded_form(num):
        num = list(str(num))
        new_string = ''
        for i, each in enumerate(num):
            a = len(num) - (i+1)
            print num, [each], a
            if each != '0':  
                new_string += (each + '0' * a + ' + ')
    
        return new_string[0:len(new_string)-3]
    
    print expanded_form(70304)
    
    输出:

    ['7', '0', '3', '0', '4'] ['7'] 4
    ['0', '3', '0', '4'] ['3'] 3
    ['3', '0', '4'] ['4'] 2
    70000 + 3000 + 400
    
    ['7', '0', '3', '0', '4'] ['7'] 4
    ['7', '0', '3', '0', '4'] ['0'] 3
    ['7', '0', '3', '0', '4'] ['3'] 2
    ['7', '0', '3', '0', '4'] ['0'] 1
    ['7', '0', '3', '0', '4'] ['4'] 0
    70000 + 300 + 4
    
    这是伟大的,但你也可以在一行。 我在你允许的情况下出版了它(我希望你把它给我)。如果你不想要这个,请在评论中告诉我删除它

    连接([(每个+'0'*(len(str(num))-(i+1))+'+'))\ 对于i,枚举(str(num))中的每个,如果每个!=“0'])[:-3] 或者如果你想要一个函数

    def扩展形式(num):
    返回“”。join([(每个+'0'*(len(str(num))-(i+1))+'+'))\
    对于i,枚举(str(num))中的每个,如果每个!=“0'])[:-3]
    
    这很好,但你也可以一行完成。 我在你允许的情况下出版了它(我希望你把它给我)。如果你不想要这个,请在评论中告诉我删除它

    连接([(每个+'0'*(len(str(num))-(i+1))+'+'))\ 对于i,枚举(str(num))中的每个,如果每个!=“0'])[:-3] 或者如果你想要一个函数

    def扩展形式(num):
    返回“”。join([(每个+'0'*(len(str(num))-(i+1))+'+'))\
    对于i,枚举(str(num))中的每个,如果每个!=“0'])[:-3]
    
    请修复缩进这里有一个提示:70304=7x10^5+0x10^4+3x10^3+0x10^2+4x10^1。您可以使用
    int(log10(n))+1
    确定任何大于0的整数的顺序。使用字符串执行此操作感觉效率低下且容易出错。请修复缩进此处有一个提示:70304=7x10^5+0x10^4+3x10^3+0x10^2+4x10^1。您可以使用
    int(log10(n))+1
    确定任何大于0的整数的顺序。使用字符串执行此操作感觉既低效又容易出错。