簡體   English   中英

帶有條件的奇怪 Python 行為

[英]Strange Python Behavior with Conditionals

您好,我有以下清單:

lines = ['', '', ' ', '', ' ', '', 'FA19 CHEM 102 3', 'FA19 CHEM 104 4', 'FA19 CLCV 115 ADB', 'FA19 CS 101 6', 'FA19 CS 125 PRO', 'FA19 CS 126 SL1', 'FA19 CS 173 BL2', 'FA19 ECON 1-- 7', 'FA19 ENG 100 CSA', '', '3.0 PS', '3.0 PS', '3.0 A', '3.0 PS', '4.0 PS', '3.0 A-', '3.0 A-', '3.0 PS', '0.0 S', '', '', '', '5/6', '', '', '5/4/2020', '', '', '', 'FA19 MATH 220 1', 'FA19 MATH 220 5', 'FA19 MATH 231 2', 'FA19 MATH 241 BL1', 'FA19 RHET 105 1', 'SP20 CS 225 AL2', 'SP20 CS 233 AL2', 'SP20 CWL 207 AL1', 'SP20 KIN 249 ON', 'FA20 CLCV 224 ADB', 'FA20 EPSY 220 OL', 'FA20 MATH 415 AL3', '', '0.0 PS >D', '5.0 PS', '3.0 PS', '4.0 A', '4.0 PS', '4.0 IP', '4.0 IP', '3.0 IP', '3.0 IP', '3.0 IP', '3.0 IP', '3.0 IP', '', '', '', '', '', '', '', '', '', '\uf00c', '']

我正在嘗試刪除列表中的所有字符串,它們要么是空字符串、空格,要么遵循日期“5/6”和“5/4/2020”的日期格式。 我有以下代碼來做到這一點:

    for s in lines:
        trans = re.sub('^([1-9]|1[012])[/]([0-9]|[1-9][0-9])[/](19|20)\d\d$', '', s)
        trans = re.sub('^([1-9]|1[012])[/]([0-9]|[1-9][0-9])$', '', trans)
        if (trans == '' or trans == ' '):
            lines.remove(s)

我可以向您保證我的正則表達式工作正常,但是此代碼不會從列表中刪除字符串 '5/6'。 但是,如果更改 for 循環以跳過列表中為空字符串或空格的字符串:

    for s in lines:
        if (s == '' or s == ' '):
            continue
        trans = re.sub('^([1-9]|1[012])[/]([0-9]|[1-9][0-9])[/](19|20)\d\d$', '', s)
        trans = re.sub('^([1-9]|1[012])[/]([0-9]|[1-9][0-9])$', '', trans)
        if (trans == '' or trans == ' '):
            lines.remove(s)

然后從列表中刪除字符串 '5/6'。 世界正在發生什么? 我只是錯過了一些令人尷尬的明顯嗎?

你在循環迭代時改變它,這是一個很大的禁忌。 (字典注意到並因 RuntimeError 而失敗,列表沒有。)

我建議重構為過濾謂詞函數和列表理解:

def is_valid(s):
    trans = re.sub('^([1-9]|1[012])[/]([0-9]|[1-9][0-9])[/](19|20)\d\d$', '', s)
    trans = re.sub('^([1-9]|1[012])[/]([0-9]|[1-9][0-9])$', '', trans)
    return not trans.strip()  # String without leading/trailing spaces is empty

lines = [line for line in lines if is_valid(line)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM