python-3.x 基于第一个嵌套列表,移除嵌套列表的每个列表中的所有元素

wgeznvg7  于 2022-12-20  发布在  Python
关注(0)|答案(3)|浏览(120)

我有以下列表:

a = [[0, 1, 0, 1, 1, 1], [23,22, 12, 45, 32, 33],[232, 332, 222, 342, 321, 232]]

我想删除a[0]中的0以及a[1][2]的对应值,因此结果列表应该如下所示:

d = [[1, 1, 1, 1], [22, 45, 32, 33], [332, 342, 321, 232]]
vs91vp4v

vs91vp4v1#

我喜欢itertools.compress的答案,然而,Python中的整数嵌套列表几乎总是更好地存储在numpy数组中,numpy数组提供了丰富的方法来选择行/列,例如:

>>> import numpy as np
>>> a = [[0, 1, 0, 1, 1, 1], [23,22, 12, 45, 32, 33],[232, 332, 222, 342, 321, 232]]
>>> a = np.array(a)
>>> a[:, a[0]!=0]
array([[  1,   1,   1,   1],
       [ 22,  45,  32,  33],
       [332, 342, 321, 232]])

Numpy在可能的情况下使用视图而不是副本,因此它通常也更节省内存。
回到Python列表很容易:

>>> a[:, a[0]!=0].tolist()
[[1, 1, 1, 1], [22, 45, 32, 33], [332, 342, 321, 232]]
uurv41yg

uurv41yg2#

itertools.compress是为这个任务而 * 构建 * 的,将它与listcomp配对来操作每个子列表,并强制它急切地生成每个新的子列表,这样就可以用相当简单的代码得到想要的结果:

from itertools import compress

a = [[0, 1, 0, 1, 1, 1], [23,22, 12, 45, 32, 33],[232, 332, 222, 342, 321, 232]]

new_a = [list(compress(sublst, a[0])) for sublst in a]

print(new_a)

其输出:

[[1, 1, 1, 1], [22, 45, 32, 33], [332, 342, 321, 232]]

在线试用!
每个调用使用a[0]作为选择器来确定要从数据中保留哪些元素(每个新的子-list);当a[0]中的选择器值为false(此处为0)时,将丢弃相应的元素,当为true(此处为1)时,将保留该元素。

bgibtngc

bgibtngc3#

你可能需要一个类似这样的函数(目前还没有测试):

def filter_list(ls: list[list[int]]) -> list[list[int]]:

  keep_list = a[0]

  def filter_out(ls: list[int]) -> list[int]:
    return [value for idx, value in enumerate(ls) if keep_list[idx] != 0]

  return [filter_out(l) for l in ls]

列表列表中的第一个列表是控制列表,这有点奇怪,但本质上,您希望遍历其他列表,并检查在列表中的该点,控制列表是否(keep_list)具有一个0,如果是的话就删除那个元素。我把它放在一个内部函数里因为这样更容易理解-你可以写一个嵌套的列表解析或者嵌套的for循环来达到同样的结果。

相关问题