2014-01-25 63 views
3

我有三個長度相同的列表,另一個列表存儲了我需要從所有三個列表中刪除的元素索引。這是我的意思的例子:同時刪除多個列表中的元素

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] 

我怎麼能在一條線上做到這一點?

+2

你需要三個單獨的列表?如果沒有,將它們壓縮在一起並修改一個:'d = zip(a,b,c)'。 – Blender

+0

或者,如果你需要它們的名字,那麼把它們作爲「dict」中的鍵存儲爲「a」,「b」和「c」是什麼?那麼它只是在index中的索引:''在d.values()中爲v:''del v [index]'。 – abarnert

+2

當這樣的問題出現時,它表明你的數據沒有按照它應該的方式組織。 –

回答

1

也許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]]) 
+0

太棒了,我不知道'np.delete()'命令。謝謝! – Gabriel

5

不是一條線,而是簡潔,易讀,完全地道的Python:

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

但是,你首先做這個事實意味着,也許不是3個獨立的單變量,你應該有3個列表的列表,或者由名稱爲'a','b''c'的三個列表的字典組成。


如果你真的想在一個行:

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

但是,這真的很可怕。當你不關心數值,並且建立一個你不需要的tuple時,你打電話給pop

如果你想玩高爾夫球代碼,你可以使用列表理解保存幾個字符 - 這會增加一個語言濫用,並建立另一個你並不想要的更大的對象 - 就像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) 
+0

這不是一條線,但它顯然是最易讀的解決方案 –

+0

+1的詳細答案,但我選擇了阿卡瓦爾的答案,因爲它是一個班輪。謝謝! – Gabriel

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

我覺得剛纔你的代碼是OK,使之成爲一條線:

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

但我還是喜歡留下,對於循環二行;)