Python:仅使用while循环返回不带前导零的字符串

时间:2013-06-17 01:30:32

标签: python-3.x while-loop

功能如下。我想为此使用while循环而没有方法,因为我想使用while循环和if语句进行更多练习。

def remove_leading_zeros(s):
'''(str) -> str
Return s, but without any extra leading zeros
e.g. given "007", return "7"
Precondition: Each character of s is a number.
'''
i = 0
r = ''
while i < len(s):
    if s[i] != '0':
        r = r + s[i]
    i += 1
return r

因此,当我输入remove_leading_zeros('0001950')时,我希望输出为'1950'
但是,通过上面的功能,我似乎省略了所有的零。我应该修改什么才能创建一个只省略前导零的函数?

我也试过r = r + s[i:],所以只要遇到非零,它就会在之后返回所有内容,但我不知道如何以此结束循环。

解决。感谢所有帮助!

5 个答案:

答案 0 :(得分:2)

当你发现非零时,只需返回其余的字符串:

i = 0
r = ''
while i < len(s):
    if s[i] != '0':
        return s[i:]
    i += 1
return r

甚至更简单:

i = 0
while i < len(s) and s[i] == '0':
    i += 1
return s[i:]

为了完整起见,它有一个功能:

s.lstrip('0')

答案 1 :(得分:1)

你的循环正在做的是跳过所有的零。您没有逻辑可以记住您是否已经拥有非零数字。您可以通过用以下代码替换循环来修复它:

nonZeroEncountered = False

while i < len(s):
    if nonZeroEncountered:
        r = r + s[i]
    elif s[i] != '0':
        nonZeroEncountered = True;
        r = r + s[i]
    i += 1
return r

基本上,你想要第一个非零数字后面的所有数字。此循环将跳过零,直到它达到非零数字,此后它将不再跳过任何字符。

答案 2 :(得分:1)

您可以更新它,以便在遇到第一个非零值后停止检查该字符是否为零(当前您甚至在找到非零数字后仍在检查)。例如,您可以这样做:

def remove_leading_zeros(s):
    i = 0
    while i < len(s):
        if s[i] == '0':
            # do nothing
            i += 1
        else:
            return s[i:]

我测试了它,它似乎工作。沿着这些方向的东西应该可以解决问题。这个想法是,在你点击你的第一个非零数字后,你就停止检查任何东西,只返回剩下的东西。

编辑:修复了原始答案中的几个错误。

答案 3 :(得分:1)

您可以添加一个布尔变量来指示是否还遇到了第一个非零数字,并且只从那里附加到r

def remove_leading_zeros(s):
    i = 0
    r = ''
    started = False
    while i < len(s):
        if started or s[i] != '0' or i + 1 == len(s):
            started = True
            r = r + s[i]
        i += 1
    return r

i + 1 == len(s)是对remove_leading_zeros('000')边缘情况的额外检查,以确保它返回'0'而不是''

答案 4 :(得分:0)

没有人提到的一件事是如何在你尚未准备好从函数返回时提前结束循环:使用break语句。像这样:

while True:  # A common way to write an "infinite" loop
    print("Doing some work...")
    result = do_something()
    if result is None:  # Or whatever other signal means "we're finished here"
        break  # The next thing printed will be "We're done!"
    print("Going through the loop again...")
print("We're done!")

看看它是如何工作的? break语句中断循环并在循环后的下一个语句处恢复程序流,在本例中是print("We're done!")函数调用。

还有continue语句,它会再次直接跳到循环的顶部,跳过任何剩余的语句。如果上述循环中的break代替continue,那么获得None结果会导致跳过print("Going through the loop again...")调用并直接返回print("Doing some work...") }。当然,那么就没有办法退出循环了,它真的成为一个无限循环,这将是一件坏事。

关于continue的另一件事:如果你使用的是for循环,它会(顾名思义)继续循环中的 next 项目:

for i in range(10):
    if (i % 2) == 0:
        continue
    print(i)  # Will print 1, 3, 5, 7 and 9

这两个工具continuebreak将使循环处理变得更加容易。