从列表中删除字符串

3

我有一个字符串列表,其中包含IP地址和DNS名称,我想要删除以"10."开头的值。示例数据如下:

['www.example.com','1.2.3.4','4.3.2.1','example.net','10.1.1.10','10.1.1.11',...]

我以为这很简单,从以下开始:

for v in address:   
    test = re.match('(^\d+\.)',v)
    if test:
        if test.group(1) == '10.':
            address.remove(v)

“10.”地址没有被删除,尽管我没有收到任何错误信息(并且用“print address.remove(v)”进行了一些故障排除,每个“10.”地址的结果都是“None”)。这让我相信正则表达式是错的,但它似乎在其他方面是有效的。
所以我尝试使用re.purge()——这也没有帮助,但我认为这不是我的问题因素。我还尝试使用del address[...],但没有成功。
我哪里做错了呢?
非常感谢您的关注。

当我测试你的代码时,第一个包含10.1的地址被删除了,但另一个没有被删除。 - Jeremy D
4个回答

14

简单的方法是使用列表推导式:

filtered = [ v for v in address if not v.startswith('10.') ]

尽管有几个人友善地指出了根本问题是在迭代时进行修改,但这种方法确实有效。迭代切片并修改原始数据是正确的方式 - 这种方法解决了我的问题。请参考链接 - Bit Bucket
@BitBucket:注意:链接的解决方案实际上会创建列表的副本并迭代该副本。列表推导式无疑更有效(更容易理解)。 - johnsyweb

3

一种方法是使用列表推导式str.startswith()创建一个新的list

>>> [a for a in address if not a.startswith('10.')]
['www.example.com', '1.2.3.4', '4.3.2.1', 'example.net', '...']

这样做避免了使用正则表达式和在迭代过程中删除元素,但是会创建一个副本。


1

1

最好先测试一下所涉及的确实是一个IP地址。

否则,10.some-cdn.some-mighty-corp.com将被过滤掉。

相关帖子


当然,一旦“核心代码”运行起来,这将被考虑在内。鉴于我的数据来源,这种情况发生的可能性非常小。感谢您的建议。 - Bit Bucket

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接