Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python循环缺少结果_Python_Python 3.x_List - Fatal编程技术网

Python循环缺少结果

Python循环缺少结果,python,python-3.x,list,Python,Python 3.x,List,我正在把一个有13000个名字的文件读到一个列表中 然后,我查看列表中每个项目的每个字符,如果有匹配项,我将从13000行列表中删除该行 如果我运行它一次,它将删除大约一半的列表。在第11轮中,它似乎将其降至9%。为什么这个脚本缺少结果?为什么它会接二连三地抓住他们 使用Python3 with open(fname) as f: lines = f.read().splitlines() bad_letters = ['B', 'C', 'F', 'G', 'H', 'J', 'L'

我正在把一个有13000个名字的文件读到一个列表中

然后,我查看列表中每个项目的每个字符,如果有匹配项,我将从13000行列表中删除该行

如果我运行它一次,它将删除大约一半的列表。在第11轮中,它似乎将其降至9%。为什么这个脚本缺少结果?为什么它会接二连三地抓住他们

使用Python3

with open(fname) as f:
    lines = f.read().splitlines()

bad_letters = ['B', 'C', 'F', 'G', 'H', 'J', 'L', 'O', 'P', 'Q', 'U', 'W', 'X']

def clean(callsigns, bad):
    removeline = 0

    for line in callsigns:
        for character in line:
             if character in bad:
                 removeline = 1
        if removeline == 1:
            lines.remove(line)
            removeline = 0
    return callsigns

for x in range (0, 11):
    lines = clean(lines, bad_letters)   

print (len(lines))
当您在
数组上循环(即迭代)时,您正在更改(即变异)该数组的
行。这从来都不是一个好主意,因为这意味着你在阅读时正在更改某些内容,这会导致你跳过几行,而不是一开始就删除它们

有很多方法可以解决这个问题。在下面的示例中,我们跟踪要删除的行,并以一种不改变索引的方式在单独的循环中删除它们

with open(fname) as f:
    lines = f.read().splitlines()

bad_letters = ['B', 'C', 'F', 'G', 'H', 'J', 'L', 'O', 'P', 'Q', 'U', 'W', 'X']

def clean(callsigns, bad):
    removeline = 0
    to_remove = []
    for line_i, line in enumerate(callsigns):
      for b in bad:
        if b in line:
          # We're removing this line, take note of it.
          to_remove.append(line_i)
          break
    # Remove the lines in a second step. Reverse it so the indices don't change.
    for r in reversed(to_remove):
      del callsigns[r]

    return callsigns

for x in range (0, 11):
    lines = clean(lines, bad_letters)   

将要保留的名称保存在单独的列表中。。也许这样:-

with open(fname) as f:
    lines = f.read().splitlines()

bad_letters = ['B', 'C', 'F', 'G', 'H', 'J', 'L', 'O', 'P', 'Q', 'U', 'W', 'X']

def clean(callsigns, bad):
    valid = [i for i in callsigns if not any(j in i for j in bad)]
    return valid

valid_names = clean(lines,bad_letters)

print (len(valid_names))

简洁的回答,谢谢分享。是否有一种方法可以消除循环遍历列表元素中每个字符的需要?也许可以用字典?是的,你可以。正则表达式可以工作。您还可以将
坏字母
转换为集合并使用集合交集。目前还不清楚这些方法中哪种最快,您必须尝试一下。请保持简短:)