删除列表中某个项目的所有重复项,而无需使用循环(Python)

时间:2018-09-20 10:55:27

标签: python list for-loop

我正在尝试找到一种方法来删除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的方法可以让我删除所有选中的项目?

任何帮助将不胜感激。

5 个答案:

答案 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)