我在python中以这样的方式声明了一个2D列表:
the_list = [[0 for i in range(3)] for j in range(3)]
它产生以下列表:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
然后我通过用1和2替换0来编辑列表。我相信列表中的这些值不会超过其中一个。
按值删除(即替换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
答案 0 :(得分:2)
想象一下,你有这个清单:
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]]
答案 1 :(得分:2)
我认为如果没有这一行,您的代码将在更短的时间内执行。
if int_to_delete in i:
因为隶属函数(in)基本上会比较列表中的每个元素,如果给定的数字是成员,那么你再次执行以下for循环检查。
答案 2 :(得分: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%以内)。快速测试效率:
import random
the_list = [[random.randint(1,10) for i in range(5000)] for j in range(5000)]
%%timeit
i = random.randint(0,10)
drop_int(the_list,i)
# prints:
# 1 loop, best of 3: 1.14 s per loop
%%timeit
i = random.randint(0,10)
drop_int_inplace(the_list,i)
# prints:
# 1 loop, best of 3: 1.2 s per loop
the_list = [[random.randint(1,10) for i in range(500)] for j in range(500)]
%%timeit
i = random.randint(0,10)
drop_int(the_list,i)
# prints:
# 100 loops, best of 3: 11.4 ms per loop
%%timeit
i = random.randint(0,10)
drop_int_inplace(the_list,i)
# prints:
# 100 loops, best of 3: 10.3 ms per loop