我有三个具有相同长度的列表和另一个列表,用于存储我需要从所有三个列表中删除的元素的索引。这是我的意思的一个例子:
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]
我怎么能在一行中做到这一点?
答案 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)