我有這樣如何保持列表的一致性?
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']
我有這樣如何保持列表的一致性?
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']
許多合理的答案,這裏是另一個完美的可怕之一:
[item for index, item in enumerate(lst) if index not in plist]
這是做這件事最清潔,最清晰,最快捷(也是最爲pythonic)的方式。 – 2012-02-06 20:31:17
愛列表理解。 +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
不要以相反的順序持久性有機污染物:
>>> 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
得到正確的順序彈出的項目,如果這是非常重要的。
你可以從最大的指數彈出爲了元素到最小,就像這樣:
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']
你修改列表可以很容易出錯的方法,爲什麼不使用numpy
只訪問索引內容,你想?這樣一切都保持在原位(以防萬一你需要它),這是一個新的pop list
快照。從你的def開始。的lst
和p_list
:
from numpy import *
lst = array(lst)
idx = ones(lst.shape,dtype=bool)
idx[p_list] = False
print lst[idx]
給出['b' 'c' 'e' 'f']
預期。
Numpy看起來像是一種矯枉過正的依賴性,只是爲了獲得對列表的看法。 – millimoose 2012-02-06 19:47:04
@Inddial哦,我全心全意地同意 - 儘管有時看到替代解決方案是很好的。我還試圖說明爲什麼它可能比其他方法有優勢(可重用性,減少會計錯誤等)。 – Hooked 2012-02-06 19:58:03
你爲什麼要這麼做?爲什麼不使用密鑰不更改的字典?爲什麼不使用元素代表自己的一套? – 2012-02-06 19:34:26
它看起來有點像你沒有使用列表理解的價值。如果你實際上將它存儲在一個值中並且使用它,那麼沒關係,但是如果你只是用它來巧妙地遍歷'p_list'的元素,那麼就有更好的Python語法:可信的'爲'循環。 – SingleNegationElimination 2012-02-06 20:19:37