2013-05-30 80 views
0

早上好大家好,是否可以傳遞一個列表作爲del的參數?

我簡單的問題是:我有2名列表(我們姑且稱之爲一個b)長度T的,我想消除ķ隨機元素(具有相同索引)從他們每個人。
我們暫時假設K < < T,以忽略提取兩次或更多次相同索引的概率。我可以簡單地生成一個列表aleaindexķ隨機數並將它傳遞給德爾,像

for i in range(K): 
    aleaindex.append(random.randint(0, T-1)) 
del a[aleaindex] 
del b[aleaindex] 

,並有一些Python技巧更有效地做到這一點?
非常感謝您提前!

回答

1

不,沒有辦法做到這一點。

原因是del刪除了一個名稱 - 如果還有另一個名稱附加到該對象,它將繼續存在。對象本身是未觸及的。

當您將對象存儲在列表中時,它們沒有附加名稱,只是索引。

這意味着當你有一個對象列表時,Python不知道引用這些對象的名字(如果有的話),所以它不能刪除它們。它最多可以將它們從特定列表中刪除。

最好的解決方案是創建一個不包含您不想要的值的新列表。這可以用list comprehension來實現:

new_a = [v for i, v in enumerate(a) if i not in aleaindex] 

您可以隨時指定此回a如果你需要修改的列表(a[:] = ...)。

注意,它也將更有意義,使aleaindex一組,因爲它會導致這個操作更快,順序並不重要:

aleaindex = {random.randint(0, T-1) for _ in range(K)} 
+0

很有意思的回答,非常感謝你。一些好奇心:「_」代表什麼? (我的意思是,這只是一種不顯式的方式 - 其他地方沒用 - 循環索引的名稱?)爲什麼說使用集合而不是列表更快? – Orso

+0

檢查集合上的成員資格比檢查列表中的成員資格要快得多。 –

+0

對不起@Lattyware,但我需要一點幫助,你的建議代碼的最後一行:爲什麼我把它放入我的代碼時出現語法錯誤? (^指向_for_) – Orso

相關問題