最近我遇到了這個問題字符串:在刪除列表中的項目優雅的方式,它不具有出現在另一個列表
說有我要處理的事情的清單:
process_list=["/test/fruit/apple","/test/fruit/pineapple","/test/fruit/banana","/test/tech/apple-pen","/test/animal/python","/test/animal/penguin"]
我想用另一個列表中排除的東西,比如:
exclude_list=["apple","python"]
的process_list應該是這樣的我套用exclude_list給它(包含蘇任何process_list項目後, B:
["/test/fruit/banana","/test/animal/penguin","/test/fruit/pineapple"]
,或者如果exclude_list是: exclude_list=["pen","banana"]
的process_list應該是這個應用過濾器後:
["/test/fruit/apple","/test/fruit/pineapple","/test/animal/python"]
所以我試圖在第一個是:
for item in exclude_list:
for name in (process_list):
if item in name:
process_list.remove(name)
當然這不起作用,因爲刪除元素s從列表中重複使用for
循環時不允許。代碼只刪除了第一個匹配,然後停止。
於是我想出了一個方法與另一個列表要做到這一點:
deletion_list=[] #Track names that need to be deleted
for item in exclude_list:
for name in (process_list):
if item in name:
deletion_list.append(name)
# A list comprehension
process_list=[ x for x in process_list if x not in deletion_list ]
它的工作原理,但我的膽量告訴我,有可能是一個更優雅的方式。現在需要另一個列表來存儲需要刪除的名稱。有任何想法嗎?
我更喜歡'...如果所有(e不在p ...)'更清楚地表達語義,但是我召集的主要是品味問題。 – gboffi
謝謝,它越來越優雅!順便說一下,我建議你在你的答案中保留'any()'和'all()'版本。我更喜歡'all()'版本,但是誰知道,有人可能會喜歡'any()'版本。 – zyc
@zyc:看起來好像每個人都是在第一個地方複製了「我沒有提到的」。每個人都已經有了答案。如果有人想探索,他們可能會找到它。在我看來,不是提到所有的選擇,而是最好展示正確的方式來做到這一點。太多的選擇只會造成混亂 –