如果我有一点像Python那样:
n = [1, 3, 5, 1]
n.remove(1)
print n
n将返回[3, 5, 1]
,因为.remove()
在找到第一个匹配后退出。如果找到所有匹配(或者在这种情况下,所有[3, 5]
s),我该怎么做只返回1
?
答案 0 :(得分:9)
如果创建新列表很好:
n = [x for x in n if x != 1]
当然,您也可以使用切片分配来修改列表:
n[:] = [x for x in n if x != 1]
答案 1 :(得分:2)
使用过滤功能
n = [1, 3, 5, 1]
filter(lambda a:a is not 1,n)
[3,5]
修改强>
n = [1, 3, 5, 1]
filter(lambda a:a != 1,n)
[3,5]
答案 2 :(得分:1)
>>> n = [1, 3, 5, 1]
>>> n = [e for e in n if e != 1]
>>> n
[3, 5]
如果您想删除多个元素 -
>>> g = [1,3]
>>> n = [e for e in n if e not in g]
>>> n
[5]
答案 3 :(得分:0)
这不是我通常这样做的方式,但是:
n = [1, 3, 5, 1]
REMOVECHAR = 1
while REMOVECHAR in n:
n.remove(REMOVECHAR)
# could also do:
# while 1:
# try: n.remove(REMOVECHAR)
# except ValueError as e: break
如果我这样做,我会使用list comp来制作一个新列表。
n = [1,3,5,1]
REMOVECHAR = 1
nn = [element for element in n if element != REMOVECHAR]
答案 4 :(得分:0)
您可以向后遍历列表并弹出匹配的元素。
def remove_all_in_place(target, sequence):
cursor = len(target) - 1
while cursor >= 0:
if sequence[cursor] == target:
sequence.pop(cursor)
cursor -= 1
列表推导可能更快,因为它们已经过优化,但它们不是就地操作。对于本机Python实现,我认为这将是最快的,并且就地实现。