2012-02-06 155 views
1

我有這樣如何保持列表的一致性?

lst = ['a', 'b', 'c', 'd', 'e', 'f'] 

名單我有一個彈出位置列表

p_list = [0,3] 

[lst.pop(i) for i in p_list]改名單['b', 'c', 'd', 'f'],後在這裏第一次迭代名單得到修改。下一個彈出工作在新的修改列表上。

但我想在指數[0,3],彈出從原來的列表中的元素的話,我的新名單應該是

['b', 'c', 'e', 'f'] 
+1

你爲什麼要這麼做?爲什麼不使用密鑰不更改的字典?爲什麼不使用元素代表自己的一套? – 2012-02-06 19:34:26

+0

它看起來有點像你沒有使用列表理解的價值。如果你實際上將它存儲在一個值中並且使用它,那麼沒關係,但是如果你只是用它來巧妙地遍歷'p_list'的元素,那麼就有更好的Python語法:可信的'爲'循環。 – SingleNegationElimination 2012-02-06 20:19:37

回答

5

許多合理的答案,這裏是另一個完美的可怕之一:

[item for index, item in enumerate(lst) if index not in plist] 
+0

這是做這件事最清潔,最清晰,最快捷(也是最爲pythonic)的方式。 – 2012-02-06 20:31:17

+0

愛列表理解。 +1最乾淨,最清晰。我的$ .02是:如果你調用'pset = set(plist)',然後'[item for index,item in enumerate(lst)if index index not in pset]',那麼大型plist對於大型plist大小來說要快得多。 – 2012-02-07 22:47:58

1

不要以相反的順序持久性有機污染物:

>>> lst = ['a', 'b', 'c', 'd', 'e', 'f'] 
>>> p_list = [0, 3] 
>>> [lst.pop(i) for i in reversed(p_list)][::-1] 
['a', 'd'] 
>>> lst 
['b', 'c', 'e', 'f'] 

的這裏的重要部分是,在列表理解的內部,您應該先在後面的索引中首先調用lst.pop(),所以這隻有在p_list保證按升序排列時纔有效。如果不是的話,請使用以下代替:

[lst.pop(i) for i in sorted(p_list, reverse=True)] 

注意,這種方法使得它更復雜,從p_list得到正確的順序彈出的項目,如果這是非常重要的。

3

你可以從最大的指數彈出爲了元素到最小,就像這樣:

lst = ['a', 'b', 'c', 'd', 'e', 'f'] 
p_list = [0,3] 
p_list.sort() 
p_list.reverse() 
[lst.pop(i) for i in p_list] 
lst 
#output: ['b', 'c', 'e', 'f'] 
0

你修改列表可以很容易出錯的方法,爲什麼不使用numpy只訪問索引內容,你想?這樣一切都保持在原位(以防萬一你需要它),這是一個新的pop list快照。從你的def開始。的lstp_list

from numpy import * 

lst = array(lst) 
idx = ones(lst.shape,dtype=bool) 
idx[p_list] = False 

print lst[idx] 

給出['b' 'c' 'e' 'f']預期。

+0

Numpy看起來像是一種矯枉過正的依賴性,只是爲了獲得對列表的看法。 – millimoose 2012-02-06 19:47:04

+0

@Inddial哦,我全心全意地同意 - 儘管有時看到替代解決方案是很好的。我還試圖說明爲什麼它可能比其他方法有優勢(可重用性,減少會計錯誤等)。 – Hooked 2012-02-06 19:58:03

相關問題