我击中if语句为true后,循环不断中断

时间:2019-02-06 06:03:52

标签: python loops if-statement break

我正在运行这段代码,由于某种原因,当数组中有2个元素应按“ if not inc”语句时,它只会弹出1个元素。

我已经使用打印进行调试,并且似乎在“ if not inc” == true之后循环第一次中断,我不希望这种情况发生。它应该继续循环并再次回到那里。

尝试通过并仍然没有希望的结果

def readFile():
    with open('incidents.txt') as f:
        x = f.read().splitlines()
        print(x)

    i = 0
    for inc in x:
        print(i)
        if not inc:
            x.pop(i)
            print("if command")
            pass
        i = i + 1
        print(x)


    y = x
    return y

Original Array -
['INC123123123', 'INC222222222', 'INC333333333', 'INC444444444', 'INC555555555', '', '']

Expected result is -
['INC123123123', 'INC222222222', 'INC333333333', 'INC444444444', 'INC555555555']

Actual Result is -
['INC123123123', 'INC222222222', 'INC333333333', 'INC444444444', 'INC555555555', '']

8 个答案:

答案 0 :(得分:2)

在Python中,使用i这样的计数器变量并进行i + 1并不是一个好习惯。阅读Ned Batchelder的Loop Like A Native。每当您编写Python(尤其是循环)时,请查看是否有 idiomatic 方法来实现。这就是Python之类的语言的真正魅力。另外,避免在循环时修改列表的大小。

如果您需要删除空字符串,只需使用filter(None, x)

xStr = ['INC123123123', 'INC222222222', 'INC333333333', 
        'INC444444444', 'INC555555555', '', '']

print(list(filter(None, xStr)))

filter的签名是(function_to_apply, list_of_inputs)。因此,如果您使用

lambda x: x != ''

然后它将仅选择非空字符串。与使用None相比,这是一种更为冗长的方法。如果要反转,请使用

lambda x: x == ''`

因此,如果您使用list(filter(lambda x: x == '', xStr)),它将仅选择空字符串。

答案 1 :(得分:1)

使用列表推导的单行代码:

xStr = ['INC123123123', 'INC222222222', 'INC333333333', 'INC444444444', 
        'INC555555555', '', '']
print([x for x in xStr if x])

输出:

['INC123123123', 'INC222222222', 'INC333333333', 'INC444444444', 'INC555555555']

答案 2 :(得分:1)

使用过滤器删除要删除的特定类型的字符串。您可以结合使用lambda和filter来添加条件,以删除任何特定类型的字符串。

line = ['INC123123123', 'INC222222222', 'INC333333333', 
        'INC444444444', 'INC555555555', '', '']

line_mod = filter(lambda x: x != '', line)
print line_mode

输出:

['INC123123123', 'INC222222222', 'INC333333333', 'INC444444444', 'INC555555555']

答案 3 :(得分:1)

在迭代时从列表中删除元素不是一个好主意。

尝试:

def readFile():
    with open('incidents.txt') as f:
        result = []
        for line in f:
            line = line.strip()
            if line:
                result.append(line)
    return result

答案 4 :(得分:0)

这个怎么样?它过滤掉所有长度为0的字符串

def foo():
    x = ['INC123123123', 'INC222222222', 'INC333333333', 'INC444444444', 'INC555555555', '', '']
    x =  list(filter(len, x))
    y = x
    return y

print(foo())

答案 5 :(得分:0)

您正在遍历列表时尝试对其进行修改。相反,您应该执行以下操作:

def readFile():
    with open('incidents.txt') as f:
        x = f.read().splitlines()
        print(x)

    y = [a for a in x if a]
    return y

答案 6 :(得分:0)

也许您应该改用if inc == ''

答案 7 :(得分:0)

您将使用过滤器功能删除空白字符串。

def readFile():
    with open('try.txt') as f:
        x = f.read().splitlines()
        print(x)
    i = 0
    y = list(filter(None, x))    
    return y