3 回答

TA貢獻1862條經驗 獲得超6個贊
列表理解的解決方案:
list_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]
list_positions=[2,0,4,7]
list_strings = [s for s in list_strings if not any(ch not in 'abc-' and i in list_positions for i, ch in enumerate(s))]
print(list_strings)
印刷:
['abc--daa-q', 'cbac-a-c--']
編輯:感謝@David Wierichs,一個更快的解決方案:
list_strings = [s for s in list_strings if not any(s[i] not in 'abc-' for i in list_positions)]

TA貢獻1863條經驗 獲得超2個贊
一個好的 pythonic 方法是使用“filter”函數,它可以使用特定的、用戶定義的過濾器從列表中過濾出來。為此,您需要該函數知道 list_approved 以便它可以相應地過濾掉,
為此,您可以使用包裝器或“部分”函數。出于簡單的原因,我們將使用來自 functools 的 partial。此函數允許在不同時間發送函數參數,有關更多信息,請查看:
https://docs.python.org/2/library/functools.html#functools.partial
此代碼確實根據您的規則過濾掉
from functools import partial
list_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]
list_positions=[2,0,4,7]
list_approved=["a","b","c","-"]
def filter_out_according_to_position(list_positions, list_approved, currnet_string):
return all([currnet_string[i] in list_approved for i in list_positions])
new_list = list(filter(partial(filter_out_according_to_position, list_positions, list_approved), list_strings))
print(new_list)
希望有所幫助

TA貢獻1818條經驗 獲得超7個贊
在列表本身上迭代時,您可能不會刪除元素,因為這會破壞索引并且您不會檢查最后的每個元素。使用您的代碼,"cbdc-a-c--"
例如未經過測試。
使用有意義的名字
直接使用變量
letter
,而不是word[idx_letter]
結合 2 個如果
到達禁止字母時使用 a
break
停止內循環
迭代list(list_strings)
,這會復制列表,然后您可以list_strings
毫無問題地從中刪除
for word in list(list_strings):
for idx_letter, letter in enumerate(word):
if idx_letter in list_positions and letter not in list_approved:
list_strings.remove(word)
break
print(list_strings)
另一個要看的是:使用列表理解保留匹配的詞
list_strings = [word for word in list_strings
if not any(letter not in list_approved and i in list_positions for i, letter in enumerate(word))]
添加回答
舉報