Python:按列表元素上的操作过滤大型列表

Python:按列表元素上的操作过滤大型列表,python,filtering,processing-efficiency,Python,Filtering,Processing Efficiency,我有一个大的列表,我希望筛选。我想对列表中的每个元素执行一些操作,然后删除 列表中的任何其他匹配元素。所需的输出是较短的ls,并删除匹配的后期元素。我能做到。。但是它真的很慢。 你有加快速度的建议吗 示例列表如下所示: ls = [1,2,3,......,10000000] 操作如下所示: def performOps(x): a = x**2 b = x**5 c = x**7 return a,b,c for elem in ls: res =

我有一个大的列表,我希望筛选。我想对列表中的每个元素执行一些操作,然后删除 列表中的任何其他匹配元素。所需的输出是较短的
ls
,并删除匹配的后期元素。我能做到。。但是它真的很慢。 你有加快速度的建议吗

示例列表如下所示:

ls = [1,2,3,......,10000000]
操作如下所示:

def performOps(x):
    a = x**2
    b = x**5
    c = x**7
    return a,b,c

for elem in ls:
    res = performOps(elem)
    for i in res:
        if i in ls[ls.index(elem)+1:]:
            ls.remove(elem)

您可以使用
enumerate()


使用
list(ls)
对列表副本进行迭代,以防止由于在循环中修改列表而出现索引问题。

为什么不将列表转换为集合?这样可以确保已删除双精度。 然后扩展Moinuddin四边形的答案

def filter(ls):
  final_list = set()
  for index, elem in enumerate(ls):
    final_list.add(elem)
    for item in performOps(elem):
       if item in ls:
         ls.remove(item)
  return final_list

ls = set([1,2,3.....10000])
ls = filter(ls)

由于多次调用
.index
,您的代码运行缓慢。此外,在迭代列表时编辑列表在技术上是可行的,但很难调试

这里有一种方法,我们首先构建一组要删除的数字,然后通过一个
过滤器
调用删除它们。数字集是一个集合,因为对于大的数字组,测试集合中的成员身份比测试列表中的成员身份要快得多:

# Make a set a numbers that we need to remove
toRemove = set()
for elem in ls:
    res = performOps(elem)
    for i in res:
        toRemove.add(i)
# Remove those numbers
ls = list(filter(lambda x: x not in toRemove, ls))

为什么要将
ls
转换为
set()
ls
可能有重复值。是否需要重复值?在我看来,原来的代码似乎不需要重复的代码。如果是这样的话,我们可以通过转换为一个集合并在运行performOps方法之前过滤重复项来节省循环时间。这段代码有一个bug:在尝试删除元素之前,需要检查元素是否在集合中。对于perfomOps(1),它返回(1,1,1),在您第二次尝试删除1后,它将失败。这就是我在晚上11点编码时得到的结果@感谢您的支持spot@JaseRieger:我在凌晨5点发现:您的代码不工作--它给我
ValueError:2不在
ls.index(elem)
调用的列表中。我非常喜欢这个解决方案:),但唯一的问题是performOps返回一个列表,所以我需要附加到toRemove。@user70434如果performOps返回一个列表,这段代码将起作用,因为for循环对任何iterable都有效。我调用ls.index是因为我使用了ls.remove。列表长度不断变化,所以我不想只使用I计数器作为索引位置,因为ls中元素的索引可能会从一次迭代到下一次迭代。更新了我的答案。我正在使用
enumerate(list(ls))
来阻止列表的索引<代码>列表(ls)
将创建
ls
的副本。这样迭代将出现在另一个列表上,索引将被阻止。如果我在ls[i+1:][/code>条件下,也删除了
。答案更加简化。我们不需要枚举器。这就是你要找的吗?
# Make a set a numbers that we need to remove
toRemove = set()
for elem in ls:
    res = performOps(elem)
    for i in res:
        toRemove.add(i)
# Remove those numbers
ls = list(filter(lambda x: x not in toRemove, ls))