亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何根據字符串特定位置中特定字符的存在,刪除等長字符串列表的成員?

如何根據字符串特定位置中特定字符的存在,刪除等長字符串列表的成員?

holdtom 2023-01-04 16:52:13
很抱歉,如果我沒有很好地解釋這一點,但它是這樣的:我有一個這樣的字符串列表,它們的長度都相同:list_strings=["abc-df-r-e","abc--daa-q","-ab-c-aub-","cbac-a-c--"]我有一個整數列表,它們是前一個列表中字符串的位置(所以位置都是從 0 到 9,因為每個字符串的長度都是 10):list_positions=[2,0,4,7]我想要做的是,對于第二個列表中的每個位置,從第一個列表中刪除那些位置上沒有“a”、“b”、“c”或“-”的字符串。在這種情況下,第一個字符串將被刪除,因為它在位置 4 有一個“d”,第三個字符串將被刪除,因為它在位置 7 有一個“u”。所以在這種情況下的輸出將是:list_strings=["abc--daa-q","cbac-a-c--"]我試過這個,但我不知道這是否是最好的方法:list_approved=["a","b","c","-"]for i in list_strings:     for j,k in enumerate(i):          if j in list_positions:               if i[j] not in list_approved:                    list_strings.remove(i)               else:                    pass提前感謝任何答案
查看完整描述

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)]



查看完整回答
反對 回復 2023-01-04
?
小唯快跑啊

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)

希望有所幫助


查看完整回答
反對 回復 2023-01-04
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

在列表本身上迭代時,您可能不會刪除元素,因為這會破壞索引并且您不會檢查最后的每個元素。使用您的代碼,"cbdc-a-c--"例如未經過測試。

  • 使用有意義的名字

  • 直接使用變量letter,而不是word[idx_letter]

  • 結合 2 個如果

  • 到達禁止字母時使用 abreak停止內循環

迭代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))]



查看完整回答
反對 回復 2023-01-04
  • 3 回答
  • 0 關注
  • 143 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號