我正在尝试找到一种方法来删除Python中列表中某个项目的所有出现。为此,假设我的列表是:
foo_list = [1,2,3,4,2,3]
让我们假设我试图摆脱项目2
。如果我使用.remove
方法,它将只删除列表中的第一个2
。
foo_list.remove(2)
将具有输出[1,3,4,2,3]
,但我希望具有输出[1,3,4,3]
。当然,我可以使用以下理解列表来做到这一点:
[item for item in foo_list if item !=2]
我也可以设置set(foo_list),但是我想保留不是所选元素的复制元素,在这种情况下为2
。
但是我试图寻找一种无需for循环的方法,因为我的真实列表有100000多个项目,这使此过程非常缓慢。是否有任何类似于remove
的方法可以让我删除所有选中的项目?
任何帮助将不胜感激。
答案 0 :(得分:1)
您始终可以使用filter
,但这不会比列表理解要快。
list(filter(lambda x: x != 2, foo_list))
让我们看看使用IPython的一些时间
import random
# make a large list of ints
bar_list = [random.randint(1,10000) for _ in range(100000)]
%timeit list(filter(lambda x: x != 2, bar_list))
100 loops, best of 3: 10.3 ms per loop
%timeit [x for x in bar_list if x != 2]
100 loops, best of 3: 4.34 ms per loop
列表理解速度大约是使用过滤器的两倍
答案 1 :(得分:1)
编辑:(优化列表理解性能)
为了在此示例上优化列表理解,鉴于带有要删除单词的“查找”列表是唯一的,因此可以在将其转换为set
之前先将其转换为def remove_all_from_other_list(_list, _remove_list):
_remove_list = set(_remove_list)
return [v for v in _list if v not in _remove_list]
,以提高列表理解期间的查询性能。
def remove_all(_list, value):
return [v for v in _list if v != value]
检查要点:https://gist.github.com/fsschmitt/4b2c8963485e46b4483746624b5a2bff
要检查此处介绍的所有解决方案之间的性能差异。
摘要:
列表理解:55.785589082秒。
列表理解集:17.348955028000006秒。
列表过滤:79.495240288秒。
周期:70.14259565200001秒。
通过列表理解是删除重复项的简单方法,并且具有更好的性能。
def remove_all(_list, value):
return list(filter(lambda v: v != value, _list))
尽管您始终可以利用过滤方法:
>>> remove_all([1, 2, 3, 4, 2, 3], 2)
[1, 3, 4, 3]
用法:
/dev/
绝对肯定要比多次调用'.remove'方法并验证每次是否仍然有发生的性能更高。
让我知道“ 避免列表理解”决定的特殊性,以便在需要时可以考虑其他解决方法。
答案 2 :(得分:0)
您可以使用带有lambda的过滤器,例如 filter(lambda x:x!= 2,foo_list)
答案 3 :(得分:0)
通过理解列表,我看到的唯一问题是,您基本上会在短时间内将它们都存储在内存中。
您可以尝试以下方法:
def remove_repeated_elements(element, list_):
try:
while True:
list_.remove(list_.index(element))
except ValueError:
pass
答案 4 :(得分:0)
remove()只能删除第一次出现的元素。我对时间不太了解,但是您可以尝试以下方法:
foo_list = [1,2,3,4,2,3]
while 2 in foo_list: foo_list.remove(2)
print(foo_list)