Python 从2D列表中删除项目
我用python声明了一个2D列表:Python 从2D列表中删除项目,python,performance,list,optimization,Python,Performance,List,Optimization,我用python声明了一个2D列表: the_list = [[0 for i in range(3)] for j in range(3)] 它生成以下列表: [[0, 0, 0], [0, 0, 0], [0, 0, 0]] 然后,我通过将0替换为1和2来编辑列表。我确信列表中永远不会同时出现一个以上的值 按值删除(即替换0)列表中的元素的最快方法是什么? 到目前为止,我一直在使用这个: def deleteIntFromArray(array, int_to_delete):
the_list = [[0 for i in range(3)] for j in range(3)]
它生成以下列表:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
然后,我通过将0替换为1和2来编辑列表。我确信列表中永远不会同时出现一个以上的值
按值删除(即替换0)列表中的元素的最快方法是什么?
到目前为止,我一直在使用这个:
def deleteIntFromArray(array, int_to_delete):
for i in array:
if int_to_delete in i:
for j in range(0, len(i)):
if i[j] == int_to_delete:
i[j] = 0
假设您有以下列表:
l = [[1,0,0], [0,4,0], [0,0,1], [3,0,0]]
您可以使用列表来删除(比如)1:
l = [[0 if x == 1 else x for x in sub_l] for sub_l in l]
[[0, 0, 0], [0, 4, 0], [0, 0, 0], [3, 0, 0]]
假设您有以下列表:
l = [[1,0,0], [0,4,0], [0,0,1], [3,0,0]]
您可以使用列表来删除(比如)1:
l = [[0 if x == 1 else x for x in sub_l] for sub_l in l]
[[0, 0, 0], [0, 4, 0], [0, 0, 0], [3, 0, 0]]
您可以使用列表理解来完成以下操作:
the_list = [[3, 7, 8], [6, 6, 2], [7, 10, 9]]
def drop_int(arr, i):
'''
arr : 2d list
i : integer to replace with 0
'''
return [[0 if c==i else c for c in row] for row in arr]
drop_int(the_list, 7)
# returns:
[[3, 0, 8], [6, 6, 2], [0, 10, 9]]
drop_int(the_list, 6)
# returns:
[[3, 7, 8], [0, 0, 2], [7, 10, 9]]
这是一个就地编辑列表而不是返回构建新列表的版本
def drop_int_inplace(arr, i):
for row in arr:
for j,c in enumerate(row):
if c==i:
row[j] = 0
return arr
它们似乎与编码的算法大致相同(在10%以内)。快速测试效率: 5000 x 5000列表 500 x 500列表
您可以使用列表理解来完成以下操作:
the_list = [[3, 7, 8], [6, 6, 2], [7, 10, 9]]
def drop_int(arr, i):
'''
arr : 2d list
i : integer to replace with 0
'''
return [[0 if c==i else c for c in row] for row in arr]
drop_int(the_list, 7)
# returns:
[[3, 0, 8], [6, 6, 2], [0, 10, 9]]
drop_int(the_list, 6)
# returns:
[[3, 7, 8], [0, 0, 2], [7, 10, 9]]
这是一个就地编辑列表而不是返回构建新列表的版本
def drop_int_inplace(arr, i):
for row in arr:
for j,c in enumerate(row):
if c==i:
row[j] = 0
return arr
它们似乎与编码的算法大致相同(在10%以内)。快速测试效率: 5000 x 5000列表 500 x 500列表
我认为如果没有这行代码,您的代码将在更短的时间内执行
if int_to_delete in i:
因为成员资格函数(in)基本上是比较列表中的每个元素,如果给定的数字是成员,那么您再次在下面的for循环中执行check。我认为如果没有这一行,您的代码将在更短的时间内执行
if int_to_delete in i:
因为成员资格函数(in)基本上是比较列表中的每个元素,如果给定的数字是成员,则再次执行以下for循环中的检查。
如果int\u to\u delete in i:
是不必要的,需要迭代i
。在第二个for
循环中使用enumerate
可能比使用range
更好,因为您没有提到数组有多大。您可以使用NumPy
加快大型数组的创建和子状态。使用arr=numpy.zeros((i,j))
创建一个数组,并使用类似于np.place(arr,arr==m,n)的命令将所有值m更改为n。如果i:
中的int-to-delete是不必要的,并且需要迭代i
。在第二个for
循环中使用enumerate
可能比使用range
更好,因为您没有提到数组有多大。您可以使用NumPy
加快大型数组的创建和子状态。使用arr=numpy.zeros((i,j))
创建一个数组,并使用类似于np.place(arr,arr==m,n)的命令将所有值m更改为n
我一直忘了列表理解有多有用be@GiorgioCavicchioli我的意思是,你也可以在for循环中做同样的事情。。。问题的关键是你应该在迭代时检查与目标的相等性,如果i:中的int-to-delete是完全多余的!我总是忘记理解列表有多有用be@GiorgioCavicchioli我的意思是,你也可以在for循环中做同样的事情。。。问题的关键是你应该在迭代时检查与目标的相等性,如果i:中的int-to-delete是完全多余的!我很难相信建立一个新列表会比修改一个就地列表快。我很难相信建立一个新列表会比修改一个就地列表快。同意,我认为如果项目不在某个地方,迭代W子列表是没有用的。但是我忘了在中迭代它。这是我意识到我还有很长的路要走的时候。同意,我在想,如果项目不在某个地方,迭代W子列表是没有用的。但是我忘了在中迭代它。这时我才意识到我还有很长的路要走。