如果我有这样的清单:
MyList = [1,2,3,4,5,'hi', 6,7, 'hi', 8, 'hi', 9]
如何从列表中删除所有项目“hi”?我尝试过remove()方法,但它只能运行一次:
MyList.remove('hi')
>>>> MyList
[1,2,3,4,5,6,7,'hi',8,'hi',9]
是的,我可以这样做:
while 'hi' in MyList:
MyList.remove('hi')
但有没有人知道比同一指令的n次迭代更优雅的方式?
答案 0 :(得分:4)
while 'hi' in MyList: MyList.remove('hi')
是O(N**2)
,最好使用一个简单的列表理解,它在O(N)
时间内做同样的事情:
MyList = [item for item in MyList if item != 'hi']
答案 1 :(得分:3)
使用列表理解:
MyList = [v for v in MyList if v != 'hi']
这会将列表重建为仅包含不等于'hi'
的值。
list.remove()
次调用必须将列表项的其余部分向前移动,而使用列表推导更有效。
答案 2 :(得分:2)
我猜你可以使用过滤功能。 这是文档:filter docs
MyList = [1,2,3,4,5,'hi', 6,7, 'hi', 8, 'hi', 9]
def f(item, element="hi"):
if item == element:
return False
else:
return True
print filter(f, MyList)
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9]
感谢Tim Pietzcker的改进。 f函数可以更短
def f(item, element="hi"): return item != element
答案 3 :(得分:0)
您也可以使用生成器表达式:
NewList = (x for x in MyList if x != 'hi')
然后你可以将其作为NewList.next()
进行迭代,直到它引发StopIteration。