Python for循环和url.remove()只影响其他所有条目

Python for循环和url.remove()只影响其他所有条目,python,python-3.x,list,Python,Python 3.x,List,运行for循环并从列表中删除条目(清除无效URL)时出现一些令人困惑的行为: 输出为: ['mailto:a@b.com', 'mailto:a@d.com'] 它与其他条目一致,因此我假设我对python的理解是不正确的 我用Python研究了列表理解,最后得出以下结论: urls = [s for s in urls if not ('?' not in s and '@' in s)] 这就是我想要的 这是最好的办法吗,有人能解释一下这种行为吗,因为我不明白 谢谢如果您在迭代时试图从列

运行for循环并从列表中删除条目(清除无效URL)时出现一些令人困惑的行为:

输出为:

['mailto:a@b.com', 'mailto:a@d.com']
它与其他条目一致,因此我假设我对python的理解是不正确的

我用Python研究了列表理解,最后得出以下结论:

urls = [s for s in urls if not ('?' not in s and '@' in s)]
这就是我想要的

这是最好的办法吗,有人能解释一下这种行为吗,因为我不明白


谢谢

如果您在迭代时试图从列表中删除,请复制并迭代<代码>URL[:]获取一份
URL
的副本,然后您对其进行迭代。这可以防止在遍历原始列表时出现一些意外情况:

urls = ['http://a.com/?mail=a@b.com','mailto:a@a.com', 'mailto:a@b.com', 'mailto:a@c.com', 'mailto:a@d.com']

for s in urls[:]:
    if '@' in s and '?' not in s:
        urls.remove(s)

print(urls)

但是,我更喜欢你的列表理解版,它更简洁、更通俗。

如果你在迭代时试图从列表中删除,请复制并迭代<代码>URL[:]获取一份
URL
的副本,然后您对其进行迭代。这可以防止在遍历原始列表时出现一些意外情况:

urls = ['http://a.com/?mail=a@b.com','mailto:a@a.com', 'mailto:a@b.com', 'mailto:a@c.com', 'mailto:a@d.com']

for s in urls[:]:
    if '@' in s and '?' not in s:
        urls.remove(s)

print(urls)

但是,我更喜欢你的列表理解版本,它更简洁、更通俗。

你的第一个解决方案的问题是,你在对象上迭代,同时从中删除条目。这里讨论的主题是:例如:

第一个解决方案的问题是在对象上迭代,同时从中删除条目。此处讨论的主题是:

您的预期输出是什么?抱歉,预期输出是:[',注释上的格式很奇怪,请澄清,列表中的第一项应保持原样。您的预期输出是什么?抱歉,预期输出是:[”,注释上的格式很奇怪,要清楚,列表中的第一个条目应该保持原样。我相信这是一个很好的解决方案,但你应该解释一下。@Cole,现在呢?我正在写解释。:)这是一个很酷的技巧,当我需要做的不仅仅是基于字符的删除,还有代码的时候,这很有用我实际上可以阅读(不管它有多像python):)我相信这是一个很好的解决方案,但你应该解释一下。@Cole,现在呢?我正在写解释。:)这是一个很酷的技巧,当我需要做的不仅仅是基于字符的删除,而且仍然有我可以阅读的代码时,这很有用(不管它有多像蟒蛇):)谢谢,现在清楚了——我就是找不到。谢谢,现在清楚了——我就是找不到。