0

函数如下。我想为此使用一个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:]了,所以一旦遇到非零,它会在之后返回所有内容,但我不确定如何结束循环。

解决。感谢所有帮助!

4

5 回答 5

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')
于 2013-06-17T01:49:56.057 回答
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

基本上,您需要第一个非零数字之后的所有数字。这个循环将跳过零,直到它到达一个非零数字,之后它将不再跳过任何字符。

于 2013-06-17T01:39:35.280 回答
1

您可以对其进行更新,以便在遇到第一个非零后停止检查字符是否为零(目前即使在找到非零数字后您仍在检查)。例如,您可以这样做:

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

我对此进行了测试,它似乎有效。这些方面的东西应该可以解决问题。这个想法是,在您达到第一个非零数字后,您将停止检查任何内容并返回剩余的内容。

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

于 2013-06-17T01:44:07.903 回答
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'而不是''.

于 2013-06-17T01:44:40.093 回答
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上面循环中的那个是 acontinue而不是,那么得到一个None结果将导致跳过print("Going through the loop again...")调用并直接回到print("Doing some work..."). 当然,这样就没有办法退出循环,它真的是一个无限循环,这将是一个 Bad Thing™。

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

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

这两个工具continuebreak将使很多循环处理更容易。

于 2013-06-17T04:46:20.293 回答