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

时间:2016-03-01 12:01:37

标签: python filtering processing-efficiency

我有一个我希望过滤的大型列表。我想通过对列表中的每个元素执行一些操作然后删除来执行此操作  列表中的任何其他匹配元素。所需的输出是较短的ls,删除了匹配的post op元素。我能做到......但它真的很慢。  你有建议加快速度吗?

示例列表如下所示:

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)

3 个答案:

答案 0 :(得分:1)

您可以使用enumerate()

# Iterate list along with index as 'i'
for elem in list(ls):
    res = performOps(elem)
    if i in ls:
        ls.remove(x) 

使用list(ls)迭代列表副本,防止因循环内的列表修改而导致索引问题。

答案 1 :(得分:1)

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

这是一种方法,我们首先构建一组要删除的数字,然后使用单个filter调用删除它们。这组数字是一个集合,因为对于大型数字组,测试集合中的成员资格要比列表中的成员资格要快得多:

# 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))

答案 2 :(得分:0)

为什么不将列表转换为集合?这样可以确保已删除双打。 然后扩展了Moinuddin Quadri的答案

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)