Python: 通过对列表元素的操作过滤大列表
Python: Filtering large list by operations on list elements
我有一个大列表需要过滤。我想通过对列表中的每个元素执行一些操作然后删除来做到这一点
列表中的任何其他匹配元素。所需的输出是较短的 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)
您可以使用 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)
迭代列表的副本,防止由于在循环内修改列表而导致的索引问题。
为什么不将列表转换为集合?这确保双打已经被删除。
然后扩展 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)
由于多次调用 .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))
我有一个大列表需要过滤。我想通过对列表中的每个元素执行一些操作然后删除来做到这一点
列表中的任何其他匹配元素。所需的输出是较短的 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)
您可以使用 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)
迭代列表的副本,防止由于在循环内修改列表而导致的索引问题。
为什么不将列表转换为集合?这确保双打已经被删除。 然后扩展 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)
由于多次调用 .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))