从数组中移除项

2 投票
4 回答
536 浏览
提问于 2025-04-18 15:18

我有一个数组,里面的内容像这样:[0 0 0]、[3 3 3]、[255 255 255](这些数字是RGB值),我想把所有值为[0 0 0]的项去掉,结果应该是:[3 3 3]、[255 255 255]。为了实现我的不同算法,首先我需要把这个数组转换成列表(使用.tolist方法),这样我得到的列表是这样的:“[0, 0, 0]”、“[3, 3, 3]”、“[255, 255, 255]”。所以第一个问题是:[0 0 0]和“[0, 0, 0]”有什么区别吗?

另外,我使用了很多地方提到的不同算法,比如:

for n,i in enumerate(mylist)
    if 0 in i: mylist[n].remove(0)

或者

def clear_list_from_item(mylist, item):
    try:
       while True: mylist.remove(item)
    except ValueError:
       return mylist

mylist = [clear_list_from_item(x, 0) for x in mylist]

但是都没有返回结果。第二个问题是:为什么?是因为我的列表吗?因为当我在像a = [[3, 4], [5], [6, 7, 8]]这样的列表上应用时,所有算法都很好用。

更新:1)嵌套的层级:269x562(也就是我正在处理的图片的高度和宽度,所以我为每个像素得到一个列表) 2)在使用.tolist()方法之前,我的初始数组的第一行有18个值。

[[  0   0   0]
[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]
[250 250 250]
[255 255 255]
[255 255 255]
[255 255 255]
[255 255 255]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]
[  0   0   0]

4 个回答

0

在Python中,[0 0 0]和"[0, 0, 0]"有什么区别呢?

[0 0 0]其实什么都不是,除非你在零之间加上逗号,这样它就变成了一个列表。而"[0,0,0]"则是一个字符串。

t = [[0, 0, 0],[3, 3, 3],[255, 255, 255]]
[f for f in t if f != [0,0,0]]

这会给你一个包含多个列表的结果,而这些列表的内容不是0,0,0。

我得说你的问题不太清楚。如果我的回答不是你想要的,请告诉我我漏掉了什么。

0

你应该修改你的第一个函数,具体如下:

mylist = [[0, 0, 0],[3, 3, 3],[255, 255, 255]]
for n,i in enumerate(mylist):
    if i == [0,0,0]:
         mylist.pop(n) # pop remove object at position n in-place
         # or with : mylist.remove(i)

注意,使用pop()或remove()会导致列表的索引出现问题。如果你在if之前打印i,它会显示:[0, 0, 0],[255, 255, 255],而不是[3, 3, 3]

所以你应该选择一些不改变原始数据的方法,比如:

my_new_list = [i for i in mylist if i!=[0,0,0]]

或者如果你一开始有一个数组:

my_new_array = np.array([i for i in myarray if (i!=0).all()])

或者

my_new_array = np.array([i for i in myarray if any(i)]) # but specific to remove array of 0s.

希望这些能帮到你。

2

假设你有以下的源列表:

>>> my_nested_list = [[0, 0, 0], [3, 3 ,3], [255, 255, 555]]

有几种方法可以删除包含所有零的条目。一种不错的方法是使用列表推导,这样可以创建一个新列表,只包含你想要的值:

>>> my_new_list = [sublist for sublist in my_nested_list if sublist != [0, 0, 0]]
>>> my_new_list
[[3, 3 ,3], [255, 255, 555]]

注意,使用这种方法不会改变(修改)原始列表,这样如果你之后还需要对原始列表进行其他处理会很方便。不过,这种方法的缺点是会占用更多的内存,因为你是在创建一个新列表。

如果你真的想修改你的源列表,有几种方法可以做到,其中一种是使用 del

def delete_stuff_in_my_list(m_list, pattern=[0, 0, 0]):
    for index, value in enumerate(m_list):
        if value == pattern:
            del m_list[index]

在这种情况下:

>>> delete_stuff_in_my_list(my_nested_list)
>>> my_nested_list
[[3, 3, 3], [255, 255, 255]]

顺便提一下,这里有一个很好的解释,讲述了不同的删除选项 在这里

2
mylist = filter(lambda rgb: any(rgb), mylist)

编辑

这可以做得更好:

mylist = filter(any, mylist)

撰写回答