Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从2D列表中删除项目_Python_Performance_List_Optimization - Fatal编程技术网

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

我用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):
    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子列表是没有用的。但是我忘了在中迭代它。这时我才意识到我还有很长的路要走。