Python列表。删除(x)2.7.5

Python列表。删除(x)2.7.5,python,python-2.7,Python,Python 2.7,我有两个清单如下所示。我正在尝试使用list.removex函数删除列表1和列表2中的文件,但是我的一个列表有文件扩展名,而另一个没有!我的方法应该是什么 List1 = ['myfile.v', 'myfile2.sv', 'myfile3.vhd', 'etcfile.v', 'randfile.sv'] List2 = ['myfile', 'myfile2', 'myfile3'] #This is in short what I would like to do, but the f

我有两个清单如下所示。我正在尝试使用list.removex函数删除列表1和列表2中的文件,但是我的一个列表有文件扩展名,而另一个没有!我的方法应该是什么

List1 = ['myfile.v', 'myfile2.sv', 'myfile3.vhd', 'etcfile.v', 'randfile.sv']
List2 = ['myfile', 'myfile2', 'myfile3']

#This is in short what I would like to do, but the file extensions throw off
#the tool!
for x in List2:
   List1.remove(x)

谢谢

从列表中删除项目时,在列表上循环确实很危险。您几乎总是跳过某些元素

>>> L = [1, 1, 2, 2, 3, 3]
>>> for x in L:
...     print x
...     if x == 2:
...         L.remove(2)
... 
1
1
2
3
3
它的效率也很低,因为每个.remove都是基于复杂性的

最好创建一个新列表并将其绑定回list1

或者是就地版本

list1[:] = [x for x in list1 if os.path.splitext(x)[0] not in set2]
对于评论中讨论的真正的就地版本,不使用额外的内存。并且准时到达

>>> list1 = ['myfile.v', 'myfile2.sv', 'myfile3.vhd', 'etcfile.v', 'randfile.sv']
>>> p = 0
>>> for x in list1:
...     if os.path.splitext(x)[0] not in set2:
...         list1[p] = x
...         p += 1
... 
>>> del(list1[p:])
>>> list1
['etcfile.v', 'randfile.sv']

因此,如果您想使用list.removelement,因为它对于其他人来说非常容易阅读,您可以尝试以下方法。如果您有一个函数f,如果该值正确/根据需要通过某些测试,则该函数将返回true

由于这不起作用:

def rem_vals(L):
    for x in L:
        if not f(x):
             L.remove(x)
对于列表L中要删除的多个值,我们可以使用递归,如下所示:

def rem_vals_rec(L):
    for x in L:
        if not f(x):
            L.remove(x)
            rem_vals_rec(L)

不是最快的,但最容易阅读。

后一种方法并没有真正到位,它仍然构建一个副本,然后修改原始列表以匹配副本。这里可能没有很好的理由实际需要一个就地突变,但如果你真的需要,你必须实际使用remove/del/pop/等。从其他方面来说,这都是一个很好的答案,特别是解释为什么OP应该创建一个新列表。@abarnert,它已经就位,因为可能还有其他对列表1的引用,您希望看到删除,这正是我所说的构建副本,然后修改原始列表以匹配副本的意思。更改原始列表以匹配副本是其他引用将看到删除的原因。但它仍然不是就地算法,而是复制算法。@abarnert,我认为使用完全就地版本的唯一原因是当您负担不起额外的RAM时。在这种情况下,列表非常大,以至于使用.remove etc的On**2行为非常重要。通过确保不使用.remove、del、.pop,而是在末尾保留一个额外的运行指针,后跟一个截断,可以在On中执行此操作。@abarnert,我已将此就地版本添加到我的答案中
def rem_vals_rec(L):
    for x in L:
        if not f(x):
            L.remove(x)
            rem_vals_rec(L)