从包含来自另一个列表python的字符串序列的列表中删除所有元素

时间:2014-04-15 19:10:00

标签: python

remove = ['files/2013/','files/2014/']
list = ['/5/files/2013', '/20/files/2014', '/31/files/2009', '/6/files/2008']

最终列表应仅包含

finallist = ['/31/files/2009', '/6/files/2008']

我尝试了以下代码,但无法得到它。任何人都可以告诉我们如何以及解释最简单的方法吗?

remove = ['files/2013/','files/2014/']
list = ['/5/files/2013', '/20/files/2014', '/31/files/2009', '/6/files/2008']
finallist = []
 for a in list:
        for b in remove:
            if not b in a:
                finallist.append(a)

1 个答案:

答案 0 :(得分:2)

将列表推导仅用于保留值。将remove设为元组,以便您可以使用str.endswith()

remove = tuple('/' + r.rstrip('/') for r in remove)
finallist = [f for f in files if not f.endswith(remove)]

我使用files代替list作为要处理的文件名列表。我还将/个字符添加到要删除的文件名的开头,以防止匹配的部分名称,并删除尾部斜杠,因为您的输入文件名列表也不以斜杠结尾。

演示:

>>> remove = ('/files/2013','/files/2014')
>>> files = ['/5/files/2013', '/20/files/2014', '/31/files/2009', '/6/files/2008']
>>> [f for f in files if not f.endswith(remove)]
['/31/files/2009', '/6/files/2008']

如果您需要测试包含而不是结束,则需要使用any()进行有效匹配:

[f for f in files if not any(r in f for r in remove)]

依次测试remove中的每个字符串,看它是否包含在文件名中;一旦这样的测试成功,如果是any() returns真实的话。