Python 基于函数从列表中删除项目
基于python中的函数(以及任何公共库)从列表中删除项的最有效方法是什么 例如,如果我有以下功能:Python 基于函数从列表中删除项目,python,numpy,Python,Numpy,基于python中的函数(以及任何公共库)从列表中删除项的最有效方法是什么 例如,如果我有以下功能: def func(a): return a % 2 == 1 filtered_arr = filter(func, arr) 以及下列名单: arr = [1,4,5,8,20,24] 那么我想要的结果是: new_arr = [1,5] 我知道我可以像这样简单地迭代列表: new_arr = [i for i in arr if func(a)] 只是想知道这是否是一种有效
def func(a):
return a % 2 == 1
filtered_arr = filter(func, arr)
以及下列名单:
arr = [1,4,5,8,20,24]
那么我想要的结果是:
new_arr = [1,5]
我知道我可以像这样简单地迭代列表:
new_arr = [i for i in arr if func(a)]
只是想知道这是否是一种有效的方法(对于大型数据集),或者是否有更好的方法。我在想也许可以使用np映射并更改函数以返回if True和-1 if false,然后使用np remove删除所有0
编辑:
我决定用你们所有人给出的建议自己测试它(我可能只是应该自己测试运行时,而不是懒惰和询问其他人)
filter
是迄今为止速度最快的。虽然如果您需要一个随机访问列表,它可以与[i for i in arr if func(i)]
方法相比较
numpy
[np.vectorize(func)(arr)]
比其他列表方法稍快。这是内置函数的用例:
def func(a):
return a % 2 == 1
filtered_arr = filter(func, arr)
请注意,这将返回一个迭代器,而不是列表。如果你想要一个列表,你可以创建一个带有list(filtered\u arr)
的列表,或者你提到的列表理解。但是,如果您只想迭代过滤的项,而不需要随机访问/索引,那么使用迭代器会更节省内存
这是一种很好的通用方法,用于筛选不太大且包含任意(可能是混合)类型元素的列表。如果要处理大量数值数据,则应使用其他答案中提到的NumPy解决方案之一。既然NumPy标记存在,就使用它吧。在本例中,我们对元素使用掩码,当元素除以2时,余数为1
>>> import numpy as np
>>>
>>> arr = np.array([1,4,5,8,20,24])
>>> arr
array([ 1, 4, 5, 8, 20, 24])
>>> arr[arr % 2 == 1]
array([1, 5])
使用numpy,您可以使用
numpy.vectorize
在数组元素之间映射函数,然后使用该映射将计算结果保持为True
。从你的函数开始
def func(a):
return a % 2 == 1
我们可以测试只保留[0,19]范围内的奇数值
>>> import numpy as np
>>> arr = np.arange(20)
>>> arr
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
>>> np.vectorize(func)(arr)
array([False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True])
>>> arr[np.vectorize(func)(arr)]
array([ 1, 3, 5, 7, 9, 11, 13, 15, 17, 19])
您还可以重写
func
,使其以列表作为参数:
def func(lst):
lst = [x for x in lst if x % 2 == 1]
return lst
然后做:
new_arr = func(arr)
这将为您节省一些行,而不是每次您想在列表的(元素)上使用它时,让
func
以单个数字作为参数并编写一个迭代,例如[for i in arr if func(a)]
(我可能应该自己测试运行时,而不是懒散地问别人)
filter
是目前为止速度最快的一种方法。尽管如果您需要一个随机访问列表,它可以与[i for i in arr if func(i)]
方法相媲美
numpy[np.vectorize(func)(arr)]
比其他方法稍快
我只是想发布此消息,以防将来有人遇到此问题。您需要再次将其转换为列表:
list(filter(func,arr))
@aminnd请参阅我的编辑,您应该只在实际需要时创建一个列表。“这是一种有效的方法吗?”这是一个只有您才能做出的值判断。因为您还不知道,所以对于堆栈溢出,您没有一个很好的问题。您知道其他方法--测试它们。使用定时器
。这几乎就像在您发表此评论之前我就已经对此做出了回答。我现在看到您已经回答了。对该问题至关重要的信息属于问题。就目前的情况来看,您只讨论了一个在其他地方处理得相当彻底的主题。