同时从多个列表中删除元素

2024-05-08 14:56:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有三个长度相同的列表,另一个列表存储需要从所有三个列表中删除的元素的索引。这是我的意思的一个例子:

a = [3,4,5,12,6,8,78,5,6]
b = [6,4,1,2,8,784,43,6,2]
c = [8,4,32,6,1,7,2,9,23]

(都有len()=9

另一个列表包含我需要从所有三个列表中删除的元素的索引:

d = [8,5,3]

(请注意,它已经排序)

我知道我可以从三个列表中删除一个元素:

for indx in d:
    del a[indx]
    del b[indx]
    del c[indx]

我怎么能在一条线上做到这一点?你知道吗


Tags: in元素列表forlen排序例子del
3条回答

我认为只要你的代码就可以了,把它变成一行:

In [234]: for i in d: del a[i], b[i], c[i]

In [235]: a,b,c
Out[235]: ([3, 4, 5, 6, 78, 5], [6, 4, 1, 8, 43, 6], [8, 4, 32, 1, 2, 9])

但我还是喜欢把它留给两行循环;)

也许numpy对于这样的事情很有用,如果您的三个列表是2D numpy.array,那么删除指定的列将非常容易。你知道吗

a = [3,4,5,12,6,8,78,5,6]
b = [6,4,1,2,8,784,43,6,2]
c = [8,4,32,6,1,7,2,9,23]

big_array = np.array([a,b,c])

d = [8,5,3]

结果:

>>> big_array
array([[  3,   4,   5,  12,   6,   8,  78,   5,   6],
       [  6,   4,   1,   2,   8, 784,  43,   6,   2],
       [  8,   4,  32,   6,   1,   7,   2,   9,  23]])
>>> np.delete(big_array, d, axis=1)
array([[ 3,  4,  5,  6, 78,  5],
       [ 6,  4,  1,  8, 43,  6],
       [ 8,  4, 32,  1,  2,  9]])

不是一行,而是简洁、可读、完全惯用的Python:

for indx in d:
    for x in a, b, c:
        del x[indx]

然而,事实上,你这样做首先意味着也许不是3个单独的列表变量,你应该有一个由3个列表组成的列表,或者一个由三个列表组成的dict,它们的名字分别是'a''b''c'。你知道吗


如果你真的想把它放在一行:

for indx in d: a.pop(indx), b.pop(indx), c.pop(indx)

但那真的很可怕。当您不关心值时,您正在调用pop,并建立一个您不需要的tuple。你知道吗

如果你想玩代码高尔夫,你可以通过使用一个列表来保存几个字符,这会增加一个语言滥用,并构建另一个你实际上不想要的更大的对象,就像Ioan Alexandru Cucu的回答:

[x.pop(indx) for indx in d for x in a, b, c]

当然,把它写在一行的最好方法是把它分解成一个函数:

def delemall(indices, *lists):
    for index in indices:
        for x in lists:
            del x[indx]

现在,你需要做的300次中的每一次,只是:

delemall(d, a, b, c)

相关问题 更多 >