从2D列表中删除项目

时间:2017-11-20 19:05:25

标签: 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]]

然后我通过用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

3 个答案:

答案 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%以内)。快速测试效率:

5000 x 5000列表

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

500 x 500列表

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