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

时间:2014-01-25 01:41:22

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

我怎么能在一行中做到这一点?

4 个答案:

答案 0 :(得分:5)

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

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

然而,你首先这样做的事实意味着可能不是3个单独的列表变量,你应该有3个列表的列表,或者由名称{{1}键入的三个列表的字典},'a''b'


如果你真的想要它在一行:

'c'

但那太可怕了。如果您不关心这些值,并且建立一个您不需要的for indx in d: a.pop(indx), b.pop(indx), c.pop(indx) ,则会调用pop

如果你想玩代码高尔夫,你可以使用列表理解来保存一些字符 - 这会增加一个语言滥用,并构建另一个你不想要的更大的对象 - 如在Ioan Alexandru Cucu的回答中:

tuple

当然,在一行中编写它的最佳方法是将其分解为函数:

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

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

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

答案 1 :(得分:1)

如果您的三个列表是2D numpy删除指定列,则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]])

答案 2 :(得分:1)

我认为只是你的代码没问题,只需要一行:

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])

但我仍然希望将其留给循环两行;)

答案 3 :(得分:0)

import operator
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]
d = [8,5,3]

for _ in (operator.delitem(q,i) for q in (a,b,c) for i in d): pass

print(a,b,c)