2014-04-30 53 views
2

我希望Python初學者不是太難的問題。基於第二個列表更新列表元素作爲索引

我有一個主要列表listA,我需要根據索引列表listB中的值清零該列表中的項目。

因此,例如,給出:

listA = [10, 12, 3, 8, 9, 17, 3, 7, 2, 8] 
listB = [1, 4, 8, 9] 

我想輸出是

listC = [10, 0, 3, 8, 0, 17, 3, 7, 0, 0] 

這個問題[1]似乎是相似的,但要求被刪除的元素,沒有改變。我不確定是否需要類似的方法,但如果是這樣,我不知道如何應用它。

[1] how to remove elements from one list if other list contain the indexes of the elements to be removed

回答

3

作爲一個列表理解:

listC = [value if index not in listB else 0 for index, value in enumerate(listA)] 

這對於大型列表可以改善對列表B大致使用set

setB = set(listB) 
listC = [value if index not in setB else 0 for index, value in enumerate(listA)] 

或複製並進行修改它,這是速度更快,更具可讀性:

listC = listA[:] 
for index in listB: 
    listC[index] = 0 
+0

我不太確定前者更快:它爲每個索引和一個'enumerate'調用做了一個緩慢的列表成員測試。第二種方法做一個快速複製,然後只需要儘可能多的元素爲零。 – DSM

+0

嘿,你可能是對的。有趣的是,陷入總是假設列表理解更好的陷阱是多麼容易 – mhlester

+0

感謝您的回覆。在我的實際數據中,listA有一百萬個項目,listB有1089個。使用%% timeit,第一種方法的時間爲27.5秒,第二種方法的時間只有13ms。那是對的嗎?這似乎是一個巨大的差異。 – MichaelMaggs

4

可以使用list comprehensionenumerateconditional expression

>>> listA = [10, 12, 3, 8, 9, 17, 3, 7, 2, 8] 
>>> listB = [1, 4, 8, 9] 
>>> 
>>> list(enumerate(listA)) # Just to demonstrate 
[(0, 10), (1, 12), (2, 3), (3, 8), (4, 9), (5, 17), (6, 3), (7, 7), (8, 2), (9, 8)] 
>>> 
>>> listC = [0 if x in listB else y for x,y in enumerate(listA)] 
>>> listC 
[10, 0, 3, 8, 0, 17, 3, 7, 0, 0] 
>>> 
+0

的幫助非常感謝。我很樂意接受這一點,因爲它工作正常,但因爲我只能接受一個答覆,所以我決定選擇那些也包含另一種方法的主流媒體。 – MichaelMaggs

相關問題